Jestem zaznajomiony z tą składnią:
cmd1 << EOF | cmd2
text
EOF
ale właśnie odkryłem, że bash pozwala mi pisać:
cmd1 << EOF |
text
EOF
cmd2
(heredoc jest używany jako dane wejściowe do cmd1, a wyjście cmd1 jest przesyłane potokiem do cmd2). Wydaje się, że jest to bardzo dziwna składnia. Czy jest przenośny?
big-long-command1 with lots of args << EOF | big-long-command2 with lots of args
. „Dziwna składnia” wydaje się najlepszym sposobem.Odpowiedzi:
Tak, standard POSIX na to pozwala. Według wersji z 2008 roku:
I zawiera ten przykład wielu „dokumentów tutaj” w jednym wierszu:
Nie ma więc problemu z przekierowaniami lub potokami. Twój przykład jest podobny do tego:
A gramatyka powłoki (dalej na połączonej stronie) zawiera następujące definicje:
pipe_sequence : command | pipe_sequence '|' linebreak command newline_list : NEWLINE | newline_list NEWLINE ; linebreak : newline_list | /* empty */
Tak więc po symbolu rury może następować koniec linii i nadal może być uważany za część rurociągu.
źródło
Tak, jest w gramatyce powłoki POSIX. Możesz także mieć więcej niż jeden dokument here-doc dla tego samego polecenia (niektóre inne przykłady używają dwóch
cat
wywołań, ale to również działa):Jest to wymyślone (używając 2 here-docs dla stdin), ale jeśli myślisz o wprowadzeniu danych wejściowych dla różnych deskryptorów plików, od razu ma to sens.
Istnieje również możliwość całkowitego usunięcia
cat
. Dlaczego nie udostępnić tego dokumentu bezpośrednio dlacmd
:źródło
sudo tee /etc/securefile.conf <<EOF
.Hmm, chyba tak, zgodnie z testem w bash w trybie POSIX:
$ bash --posix $ cat <<EOF | > ahoj > nazdar > EOF > sed 's/a/b/' bhoj nbzdar
źródło
EOF
. Monit zachowa się dziwnie i będziesz się zastanawiać, co do cholery jest nie takCześć, sprawdź to na przykład
#!/bin/sh ( base32 -d | base64 -d )<<ENDOFTEXT KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD CWJQIIZVUV2JOVNEOVJLINTW6PIK ENDOFTEXT
pozdrowienia
źródło