管道和标准输入重定向到 cat

管道和标准输入重定向到 cat

为什么

echo "hello world" | cat

工作时

cat < echo "hello world"

不是吗?我的(错误)直觉是管道将重定向stdout到。 catstdin

答案1

我们有两个相似但不同的东西

  • A管道

    echo "hello world" | cat   # This is a pipeline
    

    管道控制运算符(||&)将一个命令的输出连接到管道中下一个命令的输入。所以第一个例子有效,命令的输出echo“Hello word”与以下命令的输入相连cat,如果没有另行指定,则假定标准输入作为输入文件。实际上我们可以从中读取man cat

    cat-连接文件并在标准输出上打印

    下面是简单调用的示例cat

    cat Copy standard input to standard output

  • 重定向,或者更好的是尝试输入重定向<

    cat < echo "hello world"   # This is an attempt of redirection 
    

    在这种情况下,cat命令将从标准输入中获取输入重定向<使用右侧文件中的运算符<...这不是文件。这是因为它不起作用

    从重定向部分man bash

    重定向输入
    输入重定向会导致以 word 扩展命名的文件在文件描述符 n 上打开以供读取,如果未指定 n,则在标准输入(文件描述符 0)上打开。

  • 在 bash 中它起作用的原因有很多

    • cat <(echo "hello world") 流程替代

      在支持命名管道 (FIFO) 或 /dev/fd 方法命名打开文件的系统上,支持进程替换。它采用 <(list) 或的形式>(list)。进程列表运行时,其输入或输出连接到 FIFO 或 中的某个文件/dev/fd。此文件的名称作为扩展的结果作为参数传递给当前命令。如果>(list)使用 形式,则写入文件将为列表提供输入。如果<(list)使用 形式,则应读取作为参数传递的文件以获取列表的输出。

    • cat <<< $(echo "hello world")这里的字符串

      单词经过括号扩展、波浪线扩展、参数和变量扩展、命令替换、算术扩展和引号删除。不执行路径名扩展和单词拆分。结果作为单个字符串提供给命令的标准输入。

参考

  • man bash并搜索重定向管道这里的字符串工艺替代
  • man cat只是因为我们使用它......

答案2

该流从文件读取。>输出到文件,并<从文件输入。示例:

首先echo "HELLO HELLO HELLO" > HELLO.txt然后cat < HELLO.txt获取输出

 HELLO HELLO HELLO

由于输出已经到达您想要的位置,因此有点无用,但具有相同 HELLO.txt 的另一个示例cat < HELLO.txt >&1明确将cat的输出定向到 STDOUT。

更有用的是,你有时会发现文件描述符 2 的输出 (STDERR) 被重定向,命令如下

grep somepattern /path/to/a_bunch_of_files/* 2>&1 >> alloutput.txt

2>&1流将错误导向标准输出。然后所有标准输出都流式传输到 alloutput.txt。这会将错误输出放入具有标准输出的文件中。

相关内容