存在するこの回答到着bashで「cat << EOF」はどのように機能しますか?Stack Overflowで最初の2点を獲得しました。しかし、3番目のポイントは理解できません。Bashのパイプに複数行の文字列を渡す
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
grep
tee
これらの操作はすべて、次のことなく実行できますcat
。
<<EOF grep 'b' | tee b.txt
foo
bar
baz
EOF
(またはgrep 'b' <<EOF | …
)。
答え2
あなたは使用して<< EOF
いますトレドック。
複数行の文字列は一時ファイルに書き込まれ、次のようになります。標準入力のプロセス/bin/cat
。cat
(つまり、複数行の文字列)の出力はにパイプされ、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
cat
cat | 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
リダイレクトする構文、つまり):N
0
stdin
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