私はこの構文に精通しています:
cmd1 << EOF | cmd2
text
EOF
しかし、bashで次のことができることがわかりました。
cmd1 << EOF |
text
EOF
cmd2
(heredocはcmd1への入力として使用され、cmd1の出力はcmd2にパイプされます)。これは非常に奇妙な構文のようです。ポータブルですか?
はい、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 */
そのため、パイプシンボルの後には行末が続き、パイプラインの一部と見なされます。
はい、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
うーん、はい、POSIXモードでのbashのテストによると:
$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
こんにちは、これをチェックしてください、例えば
#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT
よろしく