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.
fonte
awk -Wv
em vez de ambiente de acolhimentoawk
está sendo usada e, em vez disso, codificar para a especificação POSIX .Respostas:
Alternativamente, test is awk é um link simbólico:
fonte
Tente usar o
which
comando e use seu código de saída.formate seu script para usar a variável como o comando
seria lido como
se
which
encontra nawk. Caso contrário, ele usariagawk
fonte
command
é uma festança embutido que você pode querer usar um nome diferente para a variável, e você também pode querer ver a resposta incrivelmente detalhado sobre o porquê de muitas conchas há melhores alternativas parawhich
a unix.stackexchange.com/a/85250/109842GNU Awk é muitas vezes instalado como
gawk
, comawk
um link simbólico para ele em sistemas onde GNU é o padrão. Eu acho que esse é o caso dos sistemas BSD e OS X, já que eles já têm os seusawk
.fonte
Um truque sujo
nawk-only-function()
existe apenas emnawk
fonte
Provavelmente tentaria abusar da macro AC_PROG_AWK m4 no autoconf para escolher uma, ordenando-as de maneira apropriada. Provavelmente é um exagero
fonte