在bash中重定向stdout和stderr的正确方法是什么?

Cua*_*due 10 bash zsh

这是我正在努力完成的具体任务.zsh的行为方式我喜欢

$ zsh
$ which clang > /dev/null 2&>1 && echo clang || echo gcc
clang
$ which doesntexist > /dev/null 2&>1 && echo doesntexist || echo gcc
gcc
Run Code Online (Sandbox Code Playgroud)

但是,在bash中:

$ bash
$ which clang > /dev/null 2&>1 && echo clang || echo gcc
gcc
Run Code Online (Sandbox Code Playgroud)

这是一般情况:

$ which clang > /dev/null 2&>1; echo $?
1
$ which clang; echo $?
/usr/bin/clang
0
Run Code Online (Sandbox Code Playgroud)

我如何重定向输出有问题.什么是正确的方法?

kon*_*box 13

我认为你是以错误的方式重定向:

which clang > /dev/null 2&>1; echo $?
Run Code Online (Sandbox Code Playgroud)

应该

which clang > /dev/null 2>&1; echo $?
Run Code Online (Sandbox Code Playgroud)

可能两种shell都允许使用前一种方法.在bash中,这不是正确的方式.Bash会将其解释为:

which clang >/dev/null 2 &>1; echo $?
Run Code Online (Sandbox Code Playgroud)

其中2添加了作为参数.

您可以通过创建类似的功能来验证

e() { echo "$@" >e.log; }
Run Code Online (Sandbox Code Playgroud)

称之为:

e 1 >/dev/null 2&>/dev/null
Run Code Online (Sandbox Code Playgroud)

你会进入1 2e.log.

在bash中,如果你这样调用你的命令也更简单:

which clang &>/dev/null; echo $?
Run Code Online (Sandbox Code Playgroud)

而不是调用外部二进制文件which,type -P而是使用.无需重定向stderr输出.

type -P clang >/dev/null; echo $?
Run Code Online (Sandbox Code Playgroud)