ヒアドキュメントをパイプするための複数行構文。これは移植可能でしょうか? 質問する

ヒアドキュメントをパイプするための複数行構文。これは移植可能でしょうか? 質問する

私はこの構文に精通しています:

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 */

したがって、パイプ記号の後に行末があっても、パイプラインの一部とみなされます。

おすすめ記事