bashの「cat << EOF | grep」はどのように機能しますか?

bashの「cat << EOF | grep」はどのように機能しますか?

存在するこの回答到着bashで「cat << EOF」はどのように機能しますか?Stack Overflowで最初の2点を獲得しました。しかし、3番目のポイントは理解できません。Bashのパイプに複数行の文字列を渡す

  1. Bashのパイプに複数行の文字列を渡す

     $ cat <<EOF | grep 'b' | tee b.txt
     foo
     bar
     baz
     EOF
    

3つの単語、2つのパイプ文字があるからです。それでは、どのように説明するのかわかりません。

答え1

あなたの意見で判断すると、次のようになります。

最初のパイプ文字("|")が何をしているのかわかりません。

最初の|文字は、の出力をcatの入力に接続しますgrep<<リダイレクト入力する;これと同様に、cat完全に別々のリダイレクトです。<cat <some_file | grep …

好むかもしれない<<EOF cat | grep 'b' | tee b.txt(比較この回答)左から右に読み込むと、データフロー方式と厳密に一致するためです。ここのドキュメント→→→ 。cat​​greptee

これらの操作はすべて、次のことなく実行できますcat

<<EOF grep 'b' | tee b.txt
foo
bar
baz
EOF

(またはgrep 'b' <<EOF | …)。

答え2

あなたは使用して<< EOFいますトレドック

複数行の文字列は一時ファイルに書き込まれ、次のようになります。標準入力のプロセス/bin/catcat(つまり、複数行の文字列)の出力はにパイプされ、grepそれは再びパイプされますtee

答え3

heredoc構文の追加例は次のとおりです。

cat <<EOF1 | cat /proc/self/fd/3 - 3<<EOF2 | cat /proc/self/fd/3 - 3<<EOF3  
foo
EOF1
bar
EOF2
baz 
EOF3

出力

baz
bar
foo

最初は、区切り文書がリダイレクトされた直後に区切り文書を提供する必要があると思うかもしれませんが、実際にはそうではありません。引き続きコマンドを作成し、追加のheredocリダイレクトを提供することもできます。これは、潜在的に長いheredocの後にコマンドを分割するように強制するリダイレクトなしでコマンドを1つの場所に保持できることを意味します。

答え4

catcat | grepチェーンに冗長性があります。これは、ニュービーが他のニュービーをコピーして貼り付ける症状です。

grep(または他のツール)は、次のことなく入力を正常に受け入れることができますcat

grep PATT <<EOF
...
EOF

シェル構文を使用すると、コマンドの前または後にIOリダイレクトを指定できます。

<<EOF grep OK - <(echo "OK 2")
OK 1
EOF

以下を印刷します(で指定されたHERE文書からstdinを検索し、で-指定されたプロセスオーバーライドで名前付きパイプを検索します<())。

(standard input):OK 1
/dev/fd/63:OK 2

必要に応じてHERE文書を持つことができます。データを別のファイル記述子に渡し、最新の「win」のリダイレクトをコピーします(下の印刷OK3)。

<<EOF1 <<EOF2 cat <<EOF3
OK1
EOF1
OK2
EOF2
OK3
EOF3

ストリーム3を開き、データを書き、後で読み取る例(記述子を記述子に<&Nリダイレクトする構文、つまり):N0stdin

exec 3<<EOF
> OK
> EOF

cat <&3
OK

procプロセスのファイル記述子はファイルシステムを介して参照できます(プロセスをフォークするときに何が使用されるかを理解する必要があり/proc/self/fd/Nます!)。self

<<EOF cat | cat - /proc/self/fd/3 3<<EOF3 | cat - /proc/self/fd/4 4<<EOF4
> OK 1
> EOF
> OK 2
> EOF3
> OK 3
> EOF4
OK 1
OK 2
OK 3

関連情報