我是一个比较有经验的Linux用户。我想更好地理解何时在 Unix/Linux 中使用管道有意义。
根据所有书籍参考文献,管道|
用于从左到右将命令连接在一起。当与ls
、ps
、等常用命令一起使用时,echo
很容易理解管道工作得非常好,因为前面的命令仅产生输出,而无需打开缓冲区查看器(例如less
)等内容。
因此,如果我执行ls | tr -d 'a'
,我们都知道一切正常。但如果我执行top -n 1 | grep 'average'
,事情就会开始变得有点奇怪。事实上,如果我们使用管道左侧的面向屏幕的命令,管道操作符本身会尝试重定向该命令的输出,有时很难理解哪种输出重定向。我认为这是由于在这种情况下管道运算符的错误使用造成的。
问题是:“我们什么时候应该使用管道运算符?如果我尝试对某些命令(例如 top 和其他面向屏幕的命令)使用管道右侧会发生什么?”
谢谢。
答案1
管道运算符 (|
) 连接两个命令(或命令列表)。输出 (标准输出)从左侧连接到输入(标准输入)右边的那个。您需要确保第一个的输出适合第二个的输入。请注意,通常误差通道(标准错误) 不通过管道重定向,而是从管道中的任何进程直接写入终端。
在 的情况下top
,它假设它正在交互式会话中写入终端。您可以使用该-b
标志告诉它应该采用批处理环境;这将关闭终端定位序列、颜色和键盘输入。
top -b -n1 | grep average
top - 21:43:52 up 4 days, 9:49, 0 user, load average: 0.00, 0.00, 0.00
某些命令,例如ls
检测它们何时直接写入终端或其他输出流并适当修改其输出。例如,在包含多个文件的目录中,比较ls
和ls | cat
。