为什么
echo "hello world" | cat
工作时
cat < echo "hello world"
不是吗?我的(错误)直觉是管道将重定向stdout
到。 cat
stdin
答案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。这会将错误输出放入具有标准输出的文件中。