13

这是我要完成的具体任务。zsh 以我喜欢的方式行事

$ zsh
$ which clang > /dev/null 2&>1 && echo clang || echo gcc
clang
$ which doesntexist > /dev/null 2&>1 && echo doesntexist || echo gcc
gcc

但是,在 bash 中:

$ bash
$ which clang > /dev/null 2&>1 && echo clang || echo gcc
gcc

这是一般情况:

$ which clang > /dev/null 2&>1; echo $?
1
$ which clang; echo $?
/usr/bin/clang
0

我重定向输出的方式有问题。什么是正确的方法?

4

3 回答 3

15

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

which clang > /dev/null 2&>1; echo $?

应该

which clang > /dev/null 2>&1; echo $?

这可能是任何一种外壳都允许前一种方法的方式。在 bash 中,这不是正确的方法。Bash 会将其解释为:

which clang >/dev/null 2 &>1; echo $?

其中2作为参数添加。

您可以通过创建类似的函数来验证这一点

e() { echo "$@" >e.log; }

并将其称为:

e 1 >/dev/null 2&>/dev/null

你会进入1 2e.log。

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

which clang &>/dev/null; echo $?

也不要像调用外部二进制文件whichtype -P而是使用它。也不需要重定向 stderr 输出。

type -P clang >/dev/null; echo $?
于 2013-09-04T21:58:54.587 回答
3

您正在使用 zsh 的&>运算符,它重定向标准错误和标准输出。您使用它的方式表明您的意思是... > /dev/null 2>&1相反。

我会这样做:

$ cc=$( type -P clang gcc othercc | head -n 1 )
$ echo $cc
/usr/bin/clang
于 2013-09-04T22:13:48.810 回答
0

用这个:

which gcc >& /dev/null && echo gcc || echo clang

你也可以使用这个:

[[ $(which gcc) ]] && echo gcc || echo clang # prints gcc
[[ $(which clang) ]] && echo gcc || echo clang # prints clang

这是有效的,因为在[[ ]]空字符串中是错误的。

于 2013-09-04T22:07:23.580 回答