私はこの構文に慣れてる:heredocをパイプするための複数行構文。これは移植可能ですか?
cmd1 << EOF | cmd2
text
EOF
ちょうどそのbashのを発見したが、私は書くことができます:
cmd1 << EOF |
text
EOF
cmd2
(ヒアドキュメントはCMD2への入力として使用されます)。これは非常に奇妙な構文のようです。それは移植可能ですか?
私はこの構文に慣れてる:heredocをパイプするための複数行構文。これは移植可能ですか?
cmd1 << EOF | cmd2
text
EOF
ちょうどそのbashのを発見したが、私は書くことができます:
cmd1 << EOF |
text
EOF
cmd2
(ヒアドキュメントはCMD2への入力として使用されます)。これは非常に奇妙な構文のようです。それは移植可能ですか?
はい、POSIX標準は、これを可能にします。 According to the 2008 version:
ここで、文書は 次
<newline>
後に始まるとの間で無<blank>
文字でのみ デリミタと<newline>
を含む行があるまで継続する単一の単語として扱われなければなりません。 次のhere-documentがあれば、それが始まります。
と同じ行の「ヒアドキュメント」の複数のこの例含まれています:
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モードではbashでのテストによると、はいとします
$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
も 'ダッシュ'で動作します –
ちょうどもう一つの小さな注記:閉じた 'EOF'の後にはスペースを入れないでください。プロンプトがうまく動作せず、何が間違っているのだろうか? –
POSIXモードでbashを実行すると、いくつかの*拡張機能がシャットダウンされますが、ほぼすべての拡張機能がシャットダウンされます。したがって、この答えはPOSIXが許すものに関して正しいが、その推論はそれを非常に効果的にサポートしていない。 –
はい、それはPOSIXシェル文法にあります。また、ここで-docの1同じコマンドためのよりをもっと持つことができます(他のいくつかの例が2つのcat
呼び出しを使用していますが、これも同様に動作します):これは、標準入力のための2ヒアドキュメントを使用して(工夫され
cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2
)、ただし、異なるファイル記述子の入力を提供すると考えるなら、すぐに意味があります。
またにはcat
が完全にになる可能性があります。 | EOF引数<<たくさんの `ビッグロングのCommand1:なぜcmd
にヒアドキュメントを直接利用できるようにしません:
cmd << EOF
input
here
EOF
'' ' 猫<< EOF1 <<上記EOF2 最初にここ-docの EOF1 二ヒアドキュメント EOF2 ' '' は動作しません。 – user1424739
@ user1424739現在のzshとbashで動作します。灰とksh93は、ここでは2番目のdocだけを出力しているようです。 – Jens
なぜdownvote?もし何か不正確なものがあれば、私に救済の機会を与えてください。 – Jens
私は複数行にこれを分割する良い方法を見つけるためにここに来ましたbig-long-command2には多くの引数があります。 「奇妙な構文」は最良の方法のようです。 – PaulC
これは、スペース区切りの表をタブ区切りの表に変換してGoogleスプレッドシートに貼り付けるときに便利なケースです。一時ファイルを作成する必要はありません。 –
最初のものはzシェルで私のために働かなかった。私は2番目のものが好きではありません。コマンドからシェルパイプラインの慣用句(?)を失う。 –