1. ホーム
  2. bash

[解決済み] heredocをパイプに通すための多行構文、これは移植可能ですか?

2022-05-02 06:14:50

質問

この構文には慣れています。

cmd1 << EOF | cmd2
text
EOF

が、bashで書けることを発見したところです。

cmd1 << EOF |
text
EOF
cmd2

(heredoc は cmd1 の入力として使用され、cmd1 の出力は cmd2 にパイプされます)。 これは非常に奇妙な構文のように思えます。 移植性はあるのでしょうか?

解決方法は?

はい、POSIX規格で認められています。 2008年版による。

<ブロッククオート

here-documentの後に始まる1つの単語として扱われるものとする。 次の <newline> のみを含む行ができるまで続きます。 デリミタと <newline> がない場合は <blank> という文字が間に入ります。 そして、次のhere-documentがあれば、それを開始します。

そして、同じ行に複数の"here-documents"が存在するこの例も含まれています。

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

つまり、パイプ記号の後に行末を付けても、パイプラインの一部とみなすことができるのです。