Estou aprendendo awk
hoje, mas não consigo ter os scripts mais simples para funcionar.
#!/usr/bin/env -S awk -f
BEGIN { }
{ }
END { }
esta saídaBEGIN: command not found
ou mesmo
#!/usr/bin/env -S awk -f
{}
esta saída{}: command not found
Quando inicio $ /usr/bin/env -S awk -f
, tenho o executável awk que exibe sua saída padrão.
E $ awk --version
diz que é awk versão 5.0.1 , no nixos 19.09.
Eu preciso usar /usr/bin/env
, porque os arquivos nixos não estão seguindo a hierarquia de diretórios FHS tradicional.
Eu suspeito que estou perdendo algo óbvio, mas procurar tutoriais awk e perguntas SO não me deu nenhuma pista por enquanto.
EDIT: a linha de comando que uso para iniciar o script
ls -l | . testawk.sh
Sourcing não é o mesmo que executar. Especificamente, o sourcing espera uma lista de comandos que podem ser executados no shell atual. O seguinte é do bash
help .
:Então, quando você executar
. file
, seu shell lerá o arquivo e executará cada comando que encontrar. No entanto, isso significa que a linha shebang é ignorada e tratada como um comentário normal. Portanto, seu shell e não awk, estava tentando executarBEGIN
.Para evitar isso, você deve executar o script em vez de buscá-lo. Se, por algum motivo, você apenas precisar originá-lo, escreva um comando awk no script:
Então, você pode fazer
Embora eu realmente não consiga pensar por que você iria querer.
Como um aparte, você deve estar ciente de que
.
(ousource
, no bash) procura por nomes de arquivos em seu arquivo$PATH
por padrão. Portanto, se você executar. foo
, e tiver umfoo
arquivo no diretório atual e umfoo
arquivo em qualquer diretório em seu$PATH
, o arquivo que será originado será aquele em seu$PATH
e não aquele em seu diretório atual. Para evitar isso, sempre use caminhos completos ao pesquisar:. ./foo
.Conforme mencionado nos comentários de AdminBee, o script foi chamado de maneira errada (fonte do conteúdo).
A forma correta é:
Ou também, mais simplesmente, sem depender da
#!
linha:Nunca use um shebang para chamar awk, pois isso rouba a capacidade de separar seus argumentos de script em partes que devem ser feitas no shell vs partes que devem ser feitas no awk e separar argumentos awk de atribuições de variáveis awk. Basta escrever seu script como:
Haverá momentos em que você deseja modificá-lo para fazer coisas como definir variáveis awk:
o que deve ser trivial como o acima, mas você não pode fazer se estiver invocando awk com um shebang.