2013-09-04 3 views
7

Ecco il compito concreto che sto cercando di realizzare. zsh si comporta il modo in cui mi piaceQual è il modo corretto per reindirizzare sia stdout che stderr in bash?

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

Ma, in bash:

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

Ecco il caso generale:

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

C'è qualcosa di sbagliato in come sto reindirizzando uscita. Qual è la strada giusta?

risposta

11

penso che tu sia reindirizzando la strada sbagliata:

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

Dovrebbe essere

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

E 'probabilmente il modo in entrambi i gusci permettono il primo metodo. In bash non è la strada giusta. Bash avrebbe interpretato invece come:

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

In quale 2 viene aggiunto come argomento.

È possibile verificare che con la creazione di una funzione come

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

e chiamarlo come:

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

E si otterrebbe 1 2 in e.log.

In bash è anche più semplice se si chiama il comando come questo:

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

anche piuttosto che chiamare un binario esterno come which, utilizzare type -P invece. Non è necessario reindirizzare anche l'output di stderr.

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

Utilizzare questa:

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

Inoltre è possibile utilizzare questo:

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

Questo funziona perché in [[ ]] stringhe vuote sono Falsey.

3

Stai usando &> operatore di zsh, che reindirizza stderr e stdout. Il modo in cui hai utilizzato suggerisce che intendevi ... > /dev/null 2>&1 invece.

vorrei fare questo come:

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