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 2そして、e.logに入るでしょう。

bash では、次のようにコマンドを呼び出すと、より簡単になります。

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

また、 のように外部バイナリを呼び出すのではなく、代わりwhichに使用type -Pします。stderr 出力もリダイレクトする必要はありません。

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