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

6
2021.12.31

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

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

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

3ワード、2パイプ文字なので。それでは、どう解釈すればいいのかわかりません。

回答
7
2021.12.31

あなたのコメントから:

最初のパイプ( "|")文字は何のためにあるのかわかりませんか?

最初の|文字がgrepの入力にcatの出力を接続しています。 <<catの入力をリダイレクトします;それはcat <some_file | grep …<に似て完全に独立し、リダイレクト、です。

これを左から右に読むと、データの流れに厳密に対応するため、 <<EOF cat | grep 'b' | tee b.txtこの回答を比較)をお勧めします。ここでは、ドキュメントcatgrepteeです。

これはすべてcatなしで実行できることに注意してください。

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

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

3
2021.12.31

ヒアドキュメント構文のさらなる例として:

 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

最初は、ヒアドキュメントのリダイレクト後、すぐにヒアドキュメントを提供する必要があると思うかもしれませんが、そうではありません。コマンドを書き続けることができ、さらにヒアドキュメントのリダイレクトを提供することもできます。これは、おそらく長いヒアドキュメントの後でコマンドを分割するようにリダイレクトすることなく、コマンドを1か所にまとめることができることを意味します。

3
2021.12.31

3つの単純なコマンドで構成されるパイプラインがあります。

  1. ヒアドキュメントを使用したcatコマンド

    cat <<EOF
      foo
      bar
      baz
    EOF
    
  2. grep 'b'

  3. tee b.txt

<<EOFは単純なコマンドに関連付けられています。ヒアドキュメントの残りの部分は、次の物理行から始まります。難読化されているが同等のコマンドは次のとおりです。

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

パイプラインは|で終了できないため、最初の物理ラインは論理的に継続されます。ただし、ヒアドキュメントの残りの部分は、パイプラインの残りの部分よりも優先されます。パイプラインの次のコマンドは、ヒアドキュメントが終了した後に解析されます。

3
2021.12.31

あなたが<< EOFで使用していることであるヒアドキュメント

複数行の文字列は一時ファイルに書き込まれ、/bin/catプロセスの標準になります。複数行の文字列であるcatの出力は、grepにパイプますひいてはその出力はteeにパイプされます。