web-dev-qa-db-ja.com

ヒアドキュメントをパイピングするための複数行構文。これはポータブルですか?

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

cmd1 << EOF | cmd2
text
EOF

しかし、bashで次のことができることがわかりました。

cmd1 << EOF |
text
EOF
cmd2

(heredocはcmd1への入力として使用され、cmd1の出力はcmd2にパイプされます)。これは非常に奇妙な構文のようです。ポータブルですか?

118
William Pursell

はい、POSIX標準ではこれが許可されています。 2008バージョンによると:

ヒアドキュメントは、次の<newline>の後に始まり、区切り文字と<newline>のみを含む行があり、その間に<blank>文字がない単一のWordとして扱われます。 。次に、次のヒアドキュメントがあれば、開始します。

そして、同じ行に複数の「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 */

そのため、パイプシンボルの後には行末が続き、パイプラインの一部と見なされます。

92
Ned Deily

はい、POSIX Shell文法にあります。 同じコマンドに対して複数のhere-docを使用することもできます(他のいくつかの例では、2つのcat呼び出しを使用しますが、これも機能します)。

cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2

これは工夫されています(stdinに2つのhere-docsを使用)が、異なるファイル記述子に入力を提供することを考えている場合、すぐに意味があります。

catを完全に削除する可能性もあります。ヒアドキュメントをcmdで直接利用できるようにしないでください:

cmd << EOF
input
here
EOF
21
Jens

うーん、はい、POSIXモードでのbashのテストによると:

$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
13
TMS

こんにちは、これをチェックしてください、例えば

#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT

よろしく

1
buc