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

Tor*_*xed 82 shell io-redirection openbsd

我已经试过各种办法都重定向stdoutstderr/dev/null没有任何成功。我几乎一生都在运行 bash,我从来没有遇到过这个问题,但有一次在 BSD 中我被/bin/sh.

我试过的:

if ls ./python* 2> /dev/null; then
    echo found Python
fi
Run Code Online (Sandbox Code Playgroud)

...哪个有效;如果 Python 不存在,它将使来自 ls 的错误消息静音。但是,如果python.tgz存在,则会输出如下所示的行:

# ./test.sh
./python-2.7.3p1.tgz
Run Code Online (Sandbox Code Playgroud)

我试过了:

if ls ./python* &> /dev/null; then
    echo found Python
fi
Run Code Online (Sandbox Code Playgroud)

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi
Run Code Online (Sandbox Code Playgroud)

if ls ./python* > /dev/null; then
    echo found Python
fi
Run Code Online (Sandbox Code Playgroud)

没有什么是真正有效的。我只能重定向输出之一,不能同时重定向。

ric*_*ici 132

这将适用于任何 Posix 兼容的 shell:

ls good bad >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

ls good bad &>/dev/null
Run Code Online (Sandbox Code Playgroud)

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

  • @Torxed,OpenBSD 的 `sh` 基于 pdksh。现在没有更多的 Bourne shell。`csh` 引入了 `>&` 也可以在 `zsh` 中使用。`bash` 选择了 `&>`(现在也被 `zsh` 和一些 `pdksh` 衍生产品支持),尽管它显然违反了 POSIX 合规性,因为 `foo &> file` 是完全有效的 POSIX 语法,这意味着完全不同的东西。 (9认同)
  • @PiotrDobrogost,`>&` 也不理想,因为它与 `>&2`、`>&-` 运算符冲突。`zsh` 为方便 csh 用户添加了它(csh 没有 `>&2`)。它们只是语法糖,只需使用标准且可移植的 `> file 2>&1`(对于类似 Bourne 的 shell)。 (7认同)
  • @PiotrDobrogost,`foo &> file` 类似于 `foo & > file` 或 `foo & : > file`,即在后台运行 foo 并打开文件进行写入,根本没有命令(不太可能像那样使用) . (5认同)
  • @StéphaneChazelas *(...) 这意味着完全不同的事情* 你让我想知道在这种情况下它意味着什么......:) (4认同)