“cat << EOF | grep”在 bash 中如何工作?

jia*_*ian 10 bash pipe io-redirection here-document

这个答案中,How does "cat << EOF" work in bash? 在 Stack Overflow 上,我得到了前两点。但我没有得到第三点Pass multi-line string to a pipeline in Bash

  1. 将多行字符串传递到 Bash 中的管道

     $ cat <<EOF | grep 'b' | tee b.txt
     foo
     bar
     baz
     EOF
    
    Run Code Online (Sandbox Code Playgroud)

因为它有 3 个单词,2 个管道字符。然后我不知道如何解释它。

Kam*_*ski 18

从你的评论来看:

\n
\n

我不确定第一个管道符(“|”)的作用是什么?

\n
\n

第一个|字符将 的输出连接cat到 的输入grep<<重定向;的输入 cat这是一个完全独立的重定向,<类似于cat <some_file | grep \xe2\x80\xa6.

\n

您可能更喜欢<<EOF cat | grep \'b\' | tee b.txt(比较这个答案),因为如果您从左到右阅读,那么它将严格对应于数据的流动方式:here\xc2\xa0document \xe2\x86\x92 cat\xe2\x86\x92 grep\xe2\x86\ x92 tee

\n

请注意,这一切都可以在没有以下内容的情况下完成cat

\n
<<EOF grep \'b\' | tee b.txt\nfoo\nbar\nbaz\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

(或者grep \'b\' <<EOF | \xe2\x80\xa6)。

\n


小智 7

您使用的<< EOFheredoc

多行字符串被写入临时文件,然后成为进程的标准/bin/cat输入。的输出cat(即多行字符串)通过管道传送到grep,而其输出又通过管道传送到tee