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.
awk -Wv
lugar del entorno host
awk
se está utilizando y codificar en su lugar la especificación POSIX .