Estou usando um aplicativo de linha de comando que é essencialmente uma coleção de scripts de shell bash. O aplicativo foi escrito para rodar no BSD / OSX e também no Linux. Um dos scripts depende do awk. Ele contém dois comandos awk: um escrito para o nawk (a implementação padrão do awd do BSD) e um escrito para o gawk (a implementação do GNU awk).
Os dois comandos 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 (por exemplo, uname -s
) para determinar o ambiente do host e, em seguida, executa o comando awk apropriado. No entanto, prefiro trabalhar com o Mac OS X com os utilitários principais GNU instalados, portanto, o script não é executado corretamente.
No processo de pensar sobre a melhor forma de corrigir esse bug, ocorreu-me que seria interessante saber como distinguir programaticamente diferentes tipos de utilitários de linha de comando comuns, de preferência de maneira relativamente robusta e portátil.
Percebi que o nawk não aceita o sinalizador '-V' para imprimir as informações da versão, então imaginei que algo como o seguinte deveria funcionar:
awk -V &>/dev/null && echo gawk || echo nawk
Outra variação poderia ser:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Isso parece funcionar em meus dois ambientes de teste (OS X e CentOS). Aqui estão minhas perguntas:
- Este é o melhor caminho a seguir?
- 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?
Eu também devo mencionar que eu sei muito pouco sobre o awk.