Tenho as implementações BSD (padrão) e GNU Awk instaladas em um Mac (a última é invocada usando gawk
em vez de apenas awk
), e tenho um script de shell com conteúdo como este:
awk -v maxLen=72 '
.
.
.
' "$1" > "$2"
Agora a parte complicada. Para funcionar corretamente, o script deve usar GNU Awk. O que significa que tenho pelo menos duas opções: 1) Modificar a primeira linha do script para que haja em gawk
vez de awk
, 2) Criar um alias de todo o sistema para GNU Awk para que ele seja invocado usando awk
em vez de gawk
. Mas eu preferiria evitar qualquer opção e, em vez disso, executar o script usando um wrapper. Ou seja, em vez de
./script.sh input.txt output.txt
Eu preferiria algo como
sed -e 's/awk/gawk/' script.sh
e então passar a saída para o Zsh de alguma forma. Disseram-me que isso é possível usando o recurso de substituição de processo do Zsh, mas como?
Supondo que o GNU
awk
foi instalado usando o Homebrew no macOS, ogawk
pacote exibe o seguinte no final da instalação (vejabrew info gawk
se você perdeu):Deixe o script fazer essa modificação
PATH
antes de executar seuawk
comando:O
awk
comando será procurado em$PATH
, e com o caminho modificado o executável será encontrado em/opt/homebrew/opt/gawk/libexec/gnubin
, se esse caminho existir. Em sistemas onde esse caminho não existir, ele usará qualquer outro comando que puder encontrar chamadoawk
.Em vez do
awk
comando no script acima, você pode usarexec "$@"
, o que tornaria o script um wrapper, como você sugere:Note que em alguns sistemas macOS, o Homebrew usa
/usr/local/homebrew
em vez de/opt/homebrew
. Se a instalação do Homebrew for feita corretamente, você deve conseguir usar$HOMEBREW_PREFIX
para essa parte do caminho.Note também que isso silenciosamente usaria um não-GNU
awk
se o GNUawk
não estivesse instalado no sistema. Para combater isso, teste a existência degawk
em seu caminho antes de executar seuawk
comando em seu script (comcommand -v gawk
), ou simplesmente use ogawk
comando em vez deawk
.Você pode fazer:
Ou:
Cuidado, pois isso também se transformará
echo The hawk squawked | /usr/bin/awk 1
emecho The hgawk squgawked | /usr/bin/gawk 1
.Em vez disso, usando o recurso
zsh
domultios
, você pode fazer:Ou você pode usar
perl
whichawk
can do anything anyawk
implementation can do and a lot more, em vez de which, e para which há apenas uma implementação (várias versões dela, é claro, mas a API é relativamente estável e geralmente compatível com versões anteriores).