1. 什么样的shell命令才能后面直接使用通道“|”
在使用通道的时候,如$ ls | grep "a.out",当中的的"|"就是使用了通道pipe,是由系统完成了ls的输出 作为grep的输入,由于|接收的是来自标准输入流作为自己的输入,所以ls的输出是标准输出(1)。 从这可以知道,如果在shell命令终端要将一个COMMOND的输出作为|的输入,就需要分类情况,如下所示:
情况1:如果COMMOND的输出为标准输出(1),则可以如下使用通道"|"
$COMMOND | grep "a.out"
情况2:如果COMMOND的输出为标准错误输出(2),则可以如下使用通道"|"
$COMMOND 2>&1 | grep "a.out"
如上所示:先将 COMMOND的标准错误输出(2)重定向到标准输出(1),然后就可以使用通道"|"了
现在来了对于给出的一个shell命令,我们有的不知道其输出是标准错误输出还是标准输出,所以有没有方法来确定此shell命令的输出是2还是1呢?,答案:可以使用strace跟踪此shell命令的write调用就可以了,如果write的第一个参数是1则此shell命令的输出就是标准输出,如果write的第一个参数是2则此shell命令的输出就是错误输出。
2. 请用strace确定ls的输出是标准输出(1)
$strace -e trace=write ls
从上面可以知道ls调用write写时是向标准输出(1)写,所以ls的输出是标准输出(1),验证了刚开始的猜测推理。
3.请使用strace确定strace的输出时标准输出(1),还是标准错误输出(2)
$strace -e trace=write strace ls
由上面的日志信息可以知道strace调用的write是写向了标准错误输出(2)
4.如何使用通达将strace的输出传给grep、less等命令
将strace的输出重定向到标准输出(1)上(2>&1),再使用管道"|"传给grep、less命令,使用方法如下所示:
$strace COMMAND 2>&1 | grep "a.cpp"
$strace COMMAND 2>&1 | less
注释:
将标准错误输出重定向到标准输出的命令位:2>&1
如果要确认某个shell命令的输出时标准输出(1)还是标准错误输出(2),还是其他输出(用户自定义的文件描述符fd等数值),就可以像上面一样使用strace命令来确认就可以。
(完)