您的位置:首页 > 运维架构 > Linux

Linux性能测试命令系列(6)- 用strace查看给定命令是标准错误输出(2)还是标准输出(1)

2016-07-03 00:43 567 查看
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命令来确认就可以。

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: