这可能是以最简单的forms提出问题的最佳地点。 我正在编写一个脚本,它将输出一个命令并将其放入一个variables中。 经过一些debugging后,我发现了命令,当它的错误没有转到标准输出,而是到控制台(或墙)。 看下面的例子:
命令成功运行时
root@local# apcaccess status APC : 700 VERSION : xxxxx BATTSTAT : AC
当命令出错时
root@local# apcaccess status apcupsd @ localhost: Connection Refused. root@local# apcaccess status | grep -i version apcupsd @ localhost: Connection Refused.
当我尝试通过grep'apcaccess status |来pipe理命令时,我注意到了 grep -i version'我将获得成功运行的版本号,但在系统上出现错误,我收到错误消息。 我相信这是不通过stdout。
问题是:我如何强制输出到goto stdout?
# apcaccess status 2>&1 | grep -i version
这将stderrredirect到标准输出,所以grep将看到输出。
原因是实际上有两个文件描述符打开“打印”到您的屏幕上。 stdout(由文件描述符1表示)和stderr(文件描述符2)。 当你将一条命令传给另一条命令时,只需从第一条命令中取出标准输出,然后将其作为标准input“pipe道”到第二条命令。 但是,如果第一个命令将某些内容打印到标准错误(通常是错误消息),而不是通过pipe道传递,而是直接打印到屏幕上。
所以你需要将stderrredirect到stdout。 通过以下实现。
command1 2>&1 | 命令2
Protips:和号是必须的原因是因为你需要说你将stderr(2)redirect到文件描述符 stdout(1)。 否则,如果没有“&”符号,您只是告诉stderrredirect到当前工作目录中名为“1”的文件 。 与通过“command> myfile.log”将命令(stdout)的“输出”转储到文件时类似。 在redirect命令前没有文件描述符默认为1(stdout)。