Passar opções para o script AWK ignorando o AWK

Passar opções para o script AWK ignorando o AWK

Posso obter argumentos que sejam opções do AWK transmitidos diretamente para um script AWK puro?

Roteiro de exemplo:

#!/usr/bin/env -S awk -f
BEGIN { if (ARGV[1] == "-h") print "whoop" }

Eu quero ./myscript -himprimir opa. Mas o AWK obtém o -h primeiro e, em vez disso, imprime seu uso.

Correr ./myscript -- -hfunciona, mas não consigo - trabalhar no shebang por causa do -f.

Eu sei que poderia usar um script de shell com AWK.

Responder1

Para o bem do desafio, isso poderia ser feito com o FreeBSDenvou com GNUambiente>= 8,30 (já assumido pelo OP) em um shebang:

#! /usr/bin/env -S sh -c 'exec awk -f "$0" -- "$@"'
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }
./myscript -h 1 2 3
-h
1
2
3

Isso não significa que seja uma boa ideia.

Você poderia tentar isso:

#! /bin/sh
BEGIN { 2>"/dev/null"
        exec awk -f "$0" "--" "$@"
}
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }

Isso pressupõe que você não tenha um BEGINcomando no seu arquivo PATH.

Responder2

Se você tem GNU awkvocê pode usar isso

#!/usr/bin/gawk --exec
BEGIN { print "==>",ARGV[1],"<==" }

Uso de amostra

./a -h
 ==> -h <==

Não testei, mas a mawkvariante parece usar -W execem vez de --exec. O GNU gawkafirma apoiar isso também, mas não funciona com arquivos #!.

informação relacionada