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ôteawk
est utilisée et de coder à la place la spécification POSIX .Réponses:
Alternativement, test is awk est un lien symbolique:
la source
Essayez d'utiliser la
which
commande et utilisez son code de sortie.puis formatez votre script pour utiliser la variable comme commande
serait lu comme
si
which
trouve nawk. Sinon, il utiliseraitgawk
la source
command
c'est un bash intégré, vous voudrez peut-être utiliser un nom différent pour votre variable, et vous voudrez peut-être aussi voir la réponse incroyablement détaillée sur les raisons pour lesquelles pour de nombreux shells il existe de meilleures alternativeswhich
à unix.stackexchange.com/a/85250/109842GNU Awk est souvent installé en tant que
gawk
, avecawk
un lien symbolique vers celui-ci sur les systèmes où GNU est la valeur par défaut. Je suppose que c'est le cas sur les systèmes BSD et OS X, car ils ont déjà le leurawk
.la source
Un hack sale
nawk-only-function()
n'existent que surnawk
la source
J'essaierais probablement d'abuser de la macro AC_PROG_AWK m4 dans autoconf pour en choisir une, en les commandant de manière appropriée. Mais c'est probablement exagéré
la source