Eu estou familiarizado com esta sintaxe:
cmd1 << EOF | cmd2
text
EOF
mas acabei de descobrir que o bash me permite escrever:
cmd1 << EOF |
text
EOF
cmd2
(o heredoc é usado como entrada para cmd1 e a saída de cmd1 é canalizada para cmd2). Parece uma sintaxe muito estranha. É portátil?
big-long-command1 with lots of args << EOF | big-long-command2 with lots of args
. A "sintaxe ímpar" parece ser a melhor maneira.Respostas:
Sim, o padrão POSIX permite isso. De acordo com a versão de 2008:
E inclui este exemplo de vários "documentos aqui" na mesma linha:
Portanto, não há nenhum problema ao fazer redirecionamentos ou pipes. Seu exemplo é semelhante a algo assim:
E a gramática do shell (mais abaixo na página vinculada) inclui estas definições:
Portanto, um símbolo de tubulação pode ser seguido por um final de linha e ainda ser considerado parte de uma tubulação.
fonte
Sim, está na gramática do shell POSIX. Você também pode ter mais de um documento aqui para o mesmo comando (alguns outros exemplos usam duas
cat
invocações, mas isso também funciona):Isso é artificial (usando 2 documentos aqui para stdin), mas se você pensa em fornecer informações para diferentes descritores de arquivo, isso imediatamente faz sentido.
Há também a possibilidade de abandonar
cat
completamente . Por que não disponibilizar o documento aqui diretamente paracmd
:fonte
sudo tee /etc/securefile.conf <<EOF
.Hmm, suponho que sim, de acordo com o teste no bash no modo POSIX:
fonte
EOF
. O prompt irá se comportar estranhamente e você vai saber o que diabos está erradoOlá, verifique isso, por exemplo
Saudações
fonte