2017-09-02 82 views
0

当我意识到输出重定向&>在脚本中不起作用时,我试图制作一个小脚本。如果我在终端如何在bash中抑制stdout和stderr

dpkg -s firefox &> /dev/null 

dpkg -s firefox 2>&1 /dev/null 

写我没有得到任何输出,但如果我在脚本中插入它,它就会显示输出。奇怪的是,如果我写脚本

dpkg -s firefox 1> /dev/null 

dpkg -s firefox 2> /dev/null 

命令的输出被抑制。我怎样才能抑制stderrstdout

+0

难道你不是指“压制stdout和stderr”吗? – pedromss

+0

是的,我的错! –

+1

您确定脚本正在使用'/ bin/bash'运行,而不是'/ bin/sh'吗? '#!'行的外观是什么? '&>'是一个'bash'扩展名,所以它可能无法在其他shell中使用。 – Barmar

回答

4

&>是bash扩展名:&>filename等同于POSIX标准>filename 2>&1

确保脚本以#!/bin/bash开头,所以它能够使用bash扩展名。 #!/bin/sh运行不同的shell(或者它可能是bash的链接,但是当它看到它以该名称运行时,它会切换到更多POSIX兼容模式)。

你几乎是正确的2>&1 >/dev/null,但顺序是重要的。重定向从左到右执行,因此您的版本将旧的stdout复制到stderr,然后将stdout重定向到/dev/null

3

制作文件描述符2(错误),其中文件描述符1(标准输出)正在写

dpkg -s firefox >/dev/null 2>&1 

这将抑制这两个来源写不出来。