私はこの構文に精通しています:
cmd1 << EOF | cmd2
text
EOF
しかし、bash では次のように書けることを発見しました:
cmd1 << EOF |
text
EOF
cmd2
(ヒアドキュメントは cmd1 への入力として使用され、cmd1 の出力は cmd2 にパイプされます)。これは非常に奇妙な構文のように思えます。移植可能でしょうか?
ベストアンサー1
はい、POSIX 標準ではこれが許可されています。2008 年版によると:
<newline>
ヒアドキュメントは、次の単語の後に始まり、区切り文字と のみを含む行が現れるまで続き、その間に文字<newline>
が入らない単一の単語として扱われます<blank>
。その後、次のヒアドキュメントがある場合は、そのヒアドキュメントが開始されます。
また、同じ行に複数の「ヒアドキュメント」が含まれる次の例も含まれています。
cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2
したがって、リダイレクトやパイプを実行しても問題はありません。あなたの例は次のようなものになります:
cat file |
cmd
シェルの文法 (リンク先のページのさらに下) には、次の定義が含まれています。
pipe_sequence : command
| pipe_sequence '|' linebreak command
newline_list : NEWLINE
| newline_list NEWLINE
;
linebreak : newline_list
| /* empty */
したがって、パイプ記号の後に行末があっても、パイプラインの一部とみなされます。