我试图了解管道是如何|
工作的;特别是,左侧命令的输出以何种方式作为右侧命令的输入传递。左侧命令的输出是否被视为作为参数传递给右侧命令的文件,即
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 风格硬件的大多数其他操作系统)下每个程序都有的两个流。read
a