输出如何在管道中作为输入传递?

输出如何在管道中作为输入传递?

我试图了解管道是如何|工作的;特别是,左侧命令的输出以何种方式作为右侧命令的输入传递。左侧命令的输出是否被视为作为参数传递给右侧命令的文件,即

a | b

a > a_output
b a_output

这意味着b将文件名作为输入并读取它。但这似乎会让事情变得像

cat wonderfulfile | tr 'a-z' 'A-Z'

不可能,因为tr不将文件名作为输入。或者将左侧命令的输出视为右侧命令的标准输入,即,如果

a

印刷

f
g
h

到屏幕上,是

a | b

b
f
g
h
^D

也许

b f g h

或者

b 'f g h'

这似乎与类似的线条相矛盾

who | less

因为 less(至少没有选项)需要文件名。感谢您的帮助。

答案1

这是第二个选项:在

a | b

输出到其标准输出的任何内容都在的标准输入a上提供。b

您感知到的矛盾不是一个:less没有选项从其标准输入读取(除非它是终端,在这种情况下它会失败),而不需要文件名。

答案2

左侧命令的输出是否被视为作为参数传递给右侧命令的文件

不。

管道将标准输出连接到标准输入。这确实是它的作用。正如您>将标准输出重定向到文件一样,|将标准输出流重定向到作为第二个命令的标准输入的流。

换句话说,每当程序从输入b执行诸如 ing 之类的操作时,它都会读取输出中的内容。中间没有文件——管道是输出和输入之间完整的“连接”。 “标准输出”和“标准输入”是 UNIX 风格的操作系统(以及 PC 风格硬件的大多数其他操作系统)下每个程序都有的两个流。reada

相关内容