2011-08-12 12 views
90

私はこの構文に慣れてる:heredocをパイプするための複数行構文。これは移植可能ですか?

cmd1 << EOF | cmd2 
text 
EOF 

ちょうどそのbashのを発見したが、私は書くことができます:

cmd1 << EOF | 
text 
EOF 
cmd2 

(ヒアドキュメントはCMD2への入力として使用されます)。これは非常に奇妙な構文のようです。それは移植可能ですか?

+0

私は複数行にこれを分割する良い方法を見つけるためにここに来ましたbig-long-command2には多くの引数があります。 「奇妙な構文」は最良の方法のようです。 – PaulC

+0

これは、スペース区切りの表をタブ区切りの表に変換してGoogleスプレッドシートに貼り付けるときに便利なケースです。一時ファイルを作成する必要はありません。 –

+0

最初のものはzシェルで私のために働かなかった。私は2番目のものが好きではありません。コマンドからシェルパイプラインの慣用句(?)を失う。 –

答えて

72

はい、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 */ 

だから、パイプ記号は、エンドを続けることができますあなたの例では、このような何かに似ていますパイプラインの一部とみなされます。

9

うーん、私はPOSIXモードではbashでのテストによると、はいとします

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

も ​​'ダッシュ'で動作します –

+0

ちょうどもう一つの小さな注記:閉じた 'EOF'の後にはスペースを入れないでください。プロンプトがうまく動作せず、何が間違っているのだろうか? –

+0

POSIXモードでbashを実行すると、いくつかの*拡張機能がシャットダウンされますが、ほぼすべての拡張機能がシャットダウンされます。したがって、この答えはPOSIXが許すものに関して正しいが、その推論はそれを非常に効果的にサポートしていない。 –

15

はい、それは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 
+0

'' ' 猫<< EOF1 <<上記EOF2 最初にここ-docの EOF1 二ヒアドキュメント EOF2 ' '' は動作しません。 – user1424739

+0

@ user1424739現在のzshとbashで動作します。灰とksh93は、ここでは2番目のdocだけを出力しているようです。 – Jens

+0

なぜdownvote?もし何か不正確なものがあれば、私に救済の機会を与えてください。 – Jens

関連する問題