No bash $0
contém o nome do script, mas no awk se eu criar um script chamado myscript.awk com o seguinte conteúdo:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
e execute, ele imprimirá apenas "awk". Além disso, o ARGV [i] com i> 0 é usado apenas para argumentos de script na linha de comando. Então, como fazê-lo imprimir o nome do script, neste caso "myscript.awk"?
mawk
é o padrão no Ubuntu? Na minha VM 15.04, o padrãoawk
égawk
. Enquanto o mawk está instalado, não é o padrão.awk -f myscript.awk
. No entanto, isso não tem relação com o problema em questão.awk
script porque começa com#!/usr/bin/awk -f
. Os scripts do shell começam com#!/bin/sh
(ou algo semelhante).awk -f file
.Respostas:
Com o GNU awk 4.1.3 no bash no cygwin:
Não sei como isso é portátil. Como sempre, porém, eu não executaria um script awk usando um shebang em um script de shell, pois apenas rouba a funcionalidade possível. Mantenha-o simples e faça isso:
Esse último funcionará com qualquer awk moderno em qualquer shell em qualquer plataforma.
fonte
ENVIRON["_"]
funciona perfeitamente e não chama nenhum programa externo. A segunda opçãoawk -v ...
depende de como se executa o script; Eu não quero issotst.sh
é enganador. É umawk
script, não um script de shell.BEGIN
não é um comando shell válido.ENVIRON["_"]
produz o caminho do script de shell de chamada quando impresso a partir de cada awk chamado via shebang de cada shell"? Eu nunca chamaria um script awk de um shebang para eu pessoalmente não me importo com a resposta, mas pensei em mencioná-la .... Ah, eu vejo nos comentários acima que @cuonglm respondeu que isso é suportado apenas em algumas conchas .*12345*/tmp/test.awk
.ARGV[0]
está sempre confiávelawk
em dash, bash, zsh e ksh93.Eu não acho que isso é possível conforme a
gawk
documentação :Em
linux
você pode tentar usar uma espécie de um truque sujo e como apontado nos comentários por Stéphane Chazelas é possível se a implementação deawk
suportes NUL bytes:fonte
gawk
e falha (como sua descrição)mawk
. Interessante!awk
- 4.0.2. No freebsd com/proc/curpoc/cmdline
, e oawk
resultado é como o seu, mas funciona comgawk
.awk -vNAME="myscript.awk" ./myscript.awk
e imprimir NAME dentro do script. Não é uma solução.Não conheço nenhuma maneira direta de obter o nome do comando no awk. No entanto, você pode encontrá-lo através de um sub-shell.
gawk
Com o GNU awk e o
ps
comando, você pode usar o ID do processoPROCINFO["PID"]
para recuperar o nome do comando como uma solução alternativa. Por exemplo:cmdname.awk
mawk e nawk
Você pode usar a mesma abordagem, mas derivar
awk
o PID da$PPID
variável especial do shell (PID do pai):cmdname.awk
Teste
Execute o script assim:
Saída nos dois casos:
fonte
gawk
, é umagawk
solução em vez de umaawk
solução. Eu acho que o @cipper deve adicionar seu desejo "uma solução portátil" à pergunta.awk -vNAME="myscript.awk" ./myscript.awk
e imprimir NAME dentro do script. Não é uma solução.Com o POSIX
awk
:Então:
fonte
awk -vNAME="myscript.awk" ./myscript.awk
e depois imprimir a variávelNAME
dentro do script. Não é uma solução.mawk
. E também usarENVIRON
não é o mesmo que usar-vNAME="myscript.awk"
, pois quandomawk
expandirá a sequência de escapeNAME
.Usando o GNU awk
Verificando o guia do usuário do GNU awk - 7.5.2 Variáveis internas que transmitem informações Eu me deparei com:
Isso significa que você pode conhecer o PID do programa durante o tempo de execução. Então, é uma questão de usar
system()
para procurar o processo com este PID fornecido:Eu uso
ps -ef
, que exibe o PID na 2ª coluna. Assumindo que a execução é feita atravésawk -f <script>
e sem outros parâmetros, podemos assumir que o último campo da linha contém as informações que queremos.Caso tivéssemos alguns parâmetros, teríamos que analisar a linha de maneira diferente - ou melhor, usar algumas das opções de
ps
para imprimir apenas as colunas nas quais estamos interessados.Teste
Observe também que outro capítulo do guia do usuário do GNU awk nos diz que o ARGV não é o caminho a seguir:
fonte
mawk
e não conseguia fazê-lo funcionar, de modo que instaleigawk
no meu Ubuntu e funcionou. Portanto, uma solução alternativa pode ser usargawk
: Dgawk
não está instalado por padrão no Ubuntu (ou pelo menos em algumas versões do Ubuntu, ondemawk
está aawk
implementação padrão ). IIRC, eu tive que instalá-lo também no Debian.