这是我正在努力完成的具体任务.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)