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

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

我尝试了各种方法来重定向 和stdoutstderr/dev/null没有成功。我几乎一生都在运行 bash,但从来没有遇到过这个问题,但在 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

没有什么真正有效。我只能重定向其中一个输出,而不能同时重定向两个输出。

答案1

这适用于任何 POSIX 兼容的 shell:

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

你必须重定向标准输出第一的在将其复制到 stderr 之前;如果你先复制它,stderr 将只指向 stdout 最初指向的内容。

重击、zsh 和其他一些 shell 也提供了快捷方式

ls good bad &>/dev/null

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

相关内容