2013-09-04 8 views
7

Oto konkretne zadanie, które próbuję osiągnąć. zsh zachowuje się tak jak lubięJaki jest poprawny sposób przekierowania zarówno stdout, jak i stderr w bashu?

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

Ale w bash:

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

Oto przypadek ogólny:

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

Coś jest nie tak ze jak mam wyjście przekierowanie. Jaka jest właściwa droga?

Odpowiedz

11

Myślę, że przekierowanie wspak:

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

Powinny być

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

To chyba jak albo muszle pozwalają dawną metodę. W bashu nie jest to właściwa droga. Bash zinterpretuje to zamiast jak:

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

W którym 2 jest dodawany jako argument.

można sprawdzić, tworząc funkcję jak

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

i nazwać jak:

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

A co można uzyskać 1 2 w e.log.

W bash to również prostsze jeśli zadzwonić do poleceń tak:

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

Również zamiast wywoływania zewnętrznego pliku binarnego jak which, zamiast używać type -P. Nie trzeba również przekierowywać wyjścia stderr.

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

Użyj tego:

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

Również można użyć to:

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

To działa, ponieważ w [[ ]] puste ciągi są falsey.

3

Używasz operatora Zsh &>, który przekierowuje stderr i stdout. Sposób, w jaki go używałeś, sugeruje, że zamiast tego miałeś na myśli ... > /dev/null 2>&1.

chciałbym to zrobić jak:

$ cc=$(type -P clang gcc othercc | head -n 1) 
$ echo $cc 
/usr/bin/clang 
Powiązane problemy