J'utilise une application en ligne de commande qui est essentiellement une collection de scripts shell bash. L'application a été écrite pour fonctionner sur BSD / OSX et également sur Linux. L'un des scripts repose sur awk. Il contient deux commandes awk: une écrite pour nawk (l'implémentation standard BSD awk) et une écrite pour gawk (l'implémentation GNU awk).
Les deux commandes awk en question ne sont pas compatibles avec les différents environnements; en particulier, la commande nawk échoue lorsqu'elle est exécutée avec gawk. Le script vérifie le nom du noyau (c'est-à-dire uname -s
) afin de déterminer l'environnement hôte, puis exécute la commande awk appropriée. Cependant, je préfère travailler sur Mac OS X avec les utilitaires GNU core installés, donc le script ne fonctionne pas correctement.
Dans le processus de réflexion sur la meilleure façon de corriger ce bogue, il m'est venu à l'esprit qu'il serait bien de savoir comment distinguer par programmation les différentes versions des utilitaires de ligne de commande courants, de préférence d'une manière relativement robuste et portable.
J'ai remarqué que nawk n'accepte pas l'indicateur '-V' pour imprimer les informations de version, j'ai donc pensé que quelque chose comme ce qui suit devrait fonctionner:
awk -V &>/dev/null && echo gawk || echo nawk
Une autre variante pourrait être:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Cela semble fonctionner sur mes deux environnements de test (OS X et CentOS). Voici mes questions:
- Est-ce la meilleure façon de procéder?
- Existe-t-il un moyen de l'étendre pour gérer d'autres variations de awk (par exemple mawk, jawk, etc.)?
- Cela vaut-il même la peine de s'inquiéter pour les autres versions d'awk?
Je devrais également mentionner que je sais très peu de choses sur awk.
awk -Wv
au lieu de l'environnement hôte
awk
est utilisée et de coder à la place la spécification POSIX .