Estoy usando una aplicación de línea de comandos que es esencialmente una colección de scripts de shell bash. La aplicación fue escrita para ejecutarse en BSD / OSX y también en Linux. Uno de los guiones se basa en awk. Contiene dos comandos awk: uno escrito para nawk (la implementación estándar BSD awk) y uno escrito para gawk (la implementación GNU awk).
Los dos comandos awk en cuestión no son compatibles con los diferentes entornos; en particular, el comando nawk falla cuando se ejecuta con gawk. El script verifica el nombre del kernel (es decir uname -s
) para determinar el entorno del host y luego ejecuta el comando awk apropiado. Sin embargo, prefiero trabajar en Mac OS X con las utilidades principales de GNU instaladas, por lo que el script no se ejecuta correctamente.
En el proceso de pensar en la mejor manera de corregir este error, se me ocurrió que sería bueno saber cómo distinguir mediante programación entre diferentes tipos de utilidades comunes de línea de comandos, preferiblemente de una manera relativamente robusta y portátil.
Noté que nawk no acepta la bandera '-V' para imprimir la información de la versión, así que pensé que algo como lo siguiente debería funcionar:
awk -V &>/dev/null && echo gawk || echo nawk
Otra variación podría ser:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Esto parece funcionar en mis dos entornos de prueba (OS X y CentOS). Aquí están mis preguntas:
- ¿Es este el mejor camino a seguir?
- ¿Hay alguna manera de extender esto para manejar otras variaciones de awk (por ejemplo, mawk, jawk, etc.)?
- ¿Vale la pena preocuparse por otras versiones de awk?
También debo mencionar que sé muy poco sobre awk.
fuente
awk -Wv
lugar del entorno hostawk
se está utilizando y codificar en su lugar la especificación POSIX .Respuestas:
Alternativamente, test is awk es un enlace simbólico:
fuente
Intente usar el
which
comando y use su código de salida.luego formatee su script para usar la variable como comando
se leería como
si
which
encuentra nawk. De lo contrario, usaríagawk
fuente
command
es un bash incorporado, es posible que desee usar un nombre diferente para su variable, y también puede que desee ver la respuesta increíblemente detallada sobre por qué para muchos shells hay mejores alternativas awhich
en unix.stackexchange.com/a/85250/109842GNU Awk a menudo se instala como
gawk
, conawk
un enlace simbólico en sistemas en los que GNU es el valor predeterminado. Supongo que este es el caso en los sistemas BSD y OS X, ya que ya tienen los suyosawk
.fuente
Un truco sucio
nawk-only-function()
existe solo ennawk
fuente
Probablemente intente abusar de la macro AC_PROG_AWK m4 en autoconf para elegir una, ordenándolas adecuadamente. Aunque probablemente sea exagerado
fuente