2013-09-04 6 views
7

Hier ist die konkrete Aufgabe, die ich versuche zu erreichen. zsh verhält sich so, wie ichWas ist der richtige Weg, um sowohl stdout als auch stderr in bash umzuleiten?

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

Aber in bash:

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

Hier ist der allgemeine Fall:

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

Irgendwas stimmt nicht mit, wie ich bin Ausgang umgeleitet wird. Was ist der richtige Weg?

Antwort

11

Ich glaube, Sie die falsche Art und Weise sind Umleitung:

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

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

Es ist wahrscheinlich, wie entweder Schalen die frühere Methode ermöglichen. In der Tat ist es nicht der richtige Weg. Bash würde interpretiert es stattdessen wie:

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

In der 2 als Argument hinzu.

Sie können das überprüfen, indem Sie eine Funktion wie

e() { echo "[email protected]" >e.log; } 

Und nennen Sie es wie die Schaffung:

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

Und Sie würden 1 2 in e.log bekommen.

In bash ist es auch einfacher, wenn Sie Ihren Befehl wie folgt aufrufen:

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

auch eher als eine externe binäre wie which aufrufen, anstatt type -P verwenden. Es ist auch nicht notwendig, die stderr-Ausgabe umzuleiten. diese

type -P clang >/dev/null; echo $? 
0

Verwendung:

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

Auch können Sie verwenden:

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

Das funktioniert, weil in [[ ]] leere Strings sind Falsey.

3

Sie verwenden den Operator &> von zsh, der stderr und stdout umleitet. Die Art, wie Sie es benutzt haben, deutet darauf hin, dass Sie stattdessen ... > /dev/null 2>&1 gemeint haben.

ich tun würde dies als:

$ cc=$(type -P clang gcc othercc | head -n 1) 
$ echo $cc 
/usr/bin/clang 
Verwandte Themen