Estou usando um aplicativo de linha de comando que é essencialmente uma coleção de scripts de shell bash. O aplicativo foi escrito para ser executado no BSD / OSX e também no Linux. Um dos scripts depende do awk. Ele contém dois comandos awk: um escrito para nawk (a implementação padrão do BSD awk) e outro escrito para gawk (a implementação GNU awk).
Os dois comandos do awk em questão não são compatíveis com os diferentes ambientes; em particular, o comando nawk falha quando executado com o gawk. O script verifica o nome do kernel (ou seja uname -s
) para determinar o ambiente host e, em seguida, executa o comando awk apropriado. No entanto, prefiro trabalhar no Mac OS X com os principais utilitários do GNU instalados, para que o script não seja executado corretamente.
No processo de pensar sobre a melhor maneira de corrigir esse bug, ocorreu-me que seria bom saber distinguir programaticamente entre diferentes tipos de utilitários de linha de comando comuns, de preferência de maneira relativamente robusta e portátil.
Notei que o nawk não aceita o sinalizador '-V' para imprimir as informações da versão, então achei que algo como o seguinte deveria funcionar:
awk -V &>/dev/null && echo gawk || echo nawk
Outra variação pode ser:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Isso parece funcionar nos meus dois ambientes de teste (OS X e CentOS). Aqui estão as minhas perguntas:
- Este é o melhor caminho a percorrer?
- Existe uma maneira de estender isso para lidar com outras variações do awk (por exemplo, mawk, jawk etc.)?
- Vale a pena se preocupar com outras versões do awk?
Também devo mencionar que sei muito pouco sobre o awk.
awk -Wv
em vez de ambiente de acolhimento
awk
está sendo usada e, em vez disso, codificar para a especificação POSIX .