使用/ bin / sh将stderr和stdout都重定向到/ dev / null


61

我已经试过各种办法都重定向stdoutstderr/dev/null没有任何成功。我几乎一生都在奔波,这是我从来没有遇到过的问题,但是在BSD中,我一度陷入困境/bin/sh

我尝试过的

if ls ./python* 2> /dev/null; then
    echo found Python
fi

...有效 如果没有Python,它将忽略ls的错误消息。但是,如果python.tgz存在的话,将输出如下所示的一行:

# ./test.sh
./python-2.7.3p1.tgz

我试过了:

if ls ./python* &> /dev/null; then
    echo found Python
fi

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

if ls ./python* > /dev/null; then
    echo found Python
fi

没什么真正的工作。我只能重定向其中一个输出,不能同时重定向两个。

Answers:


102

这可以在任何与Posix兼容的外壳中使用:

ls good bad >/dev/null 2>&1

你必须将stdout 第一复制成标准错误之前 ; 如果首先复制它,stderr只会指向stdout最初指向的内容。

Bash,zsh和其他一些shell也提供了快捷方式

ls good bad &>/dev/null

这在命令行上很方便,但是应该在可移植的脚本中避免使用。


1
确实,我阅读了bourn shell手册。它指出,的更高版本/bin/sh已经实现了该&>/dev/null语法,显然不是这样,或者我有一个较旧的版本(我不能以任何方式回显,运行OpenBSD 5.3,这样就足够了)
2013年

8
@ Torxed,OpenBSD sh是基于pdksh的。如今不再有Bourne弹壳了。csh引入的内容>&也可以在中找到zsh。尽管它显然违反了POSIX的规定,但它还是bash选择了&>(现在也得到了zsh一些pdksh派生工具的支持),因为它foo &> file是完全有效的POSIX语法,这意味着完全不同。
斯特凡Chazelas

3
@StéphaneChazelas (...)表示完全不同的内容您让我怀疑在这种情况下的含义是什么... :)
Piotr Dobrogost 2014年

4
@PiotrDobrogost foo &> file类似于foo & > filefoo & : > file,它在后台运行foo并打开文件以根本不编写任何命令(不太可能那样使用)。
斯特凡Chazelas

5
@PiotrDobrogost,>&也不理想,因为它与>&2>&-运算符冲突。zsh为方便csh用户而添加了它(csh没有>&2)。它们只是语法糖,仅用于> file 2>&1标准且可移植(对于像Bourne一样的外壳)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.