如何在bash中抑制stdout和stderr
问题描述:
当我意识到输出重定向&>
在脚本中不起作用时,我试图制作一个小脚本。如果我在终端如何在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
命令的输出被抑制。我怎样才能抑制stderr
和stdout
?
答
&>
是bash扩展名:&>filename
等同于POSIX标准>filename 2>&1
。
确保脚本以#!/bin/bash
开头,所以它能够使用bash
扩展名。 #!/bin/sh
运行不同的shell(或者它可能是bash
的链接,但是当它看到它以该名称运行时,它会切换到更多POSIX兼容模式)。
你几乎是正确的2>&1 >/dev/null
,但顺序是重要的。重定向从左到右执行,因此您的版本将旧的stdout
复制到stderr
,然后将stdout
重定向到/dev/null
。
答
制作文件描述符2(错误),其中文件描述符1(标准输出)正在写
dpkg -s firefox >/dev/null 2>&1
这将抑制这两个来源写不出来。
难道你不是指“压制stdout和stderr”吗? – pedromss
是的,我的错! –
您确定脚本正在使用'/ bin/bash'运行,而不是'/ bin/sh'吗? '#!'行的外观是什么? '&>'是一个'bash'扩展名,所以它可能无法在其他shell中使用。 – Barmar