2013-09-04 1 views
7

다음은 내가 달성하고자하는 구체적인 작업입니다. zsh을 배쉬에서, 내가 bash에서 stdout과 stderr를 모두 재지 정하는 올바른 방법은 무엇입니까?

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

을 좋아하는 방식으로 작동하지만 :
$ 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 

I 출력을 리디렉션있어 방법에 문제가있다. 올바른 방법은 무엇입니까?

답변

11

난 당신이 잘못된 길을 리디렉션 있다고 생각 :

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

그것은 하나 포탄은 전자의 방법을 허용하는 방법 아마

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

이어야한다. bash에서는 올바른 방법이 아닙니다.

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

하는 2 인수로 추가됩니다 배쉬는 대신 같은 해석 것이다.

당신은

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

같은 함수를 작성하여 다음을 확인하고 호출 할 수 있습니다 :

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

그리고 당신은 e.log에 1 2을 얻을 것입니다.

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

또한 오히려 which 같은 외부 바이너리를 호출하는 대신, 대신 type -P를 사용 :이 같은 명령 호출하는 경우 배쉬에서

은 또한 간단합니다. stderr 출력을 리디렉션 할 필요가 없습니다.

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

사용이 :

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

은 또한 당신이 사용할 수는 :

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

이는에 [[ ]] 빈 문자열이 falsey 있습니다 작동합니다.

3

stderr 및 stdout를 리디렉션하는 zsh의 &> 연산자를 사용하고 있습니다. 당신이 그것을 사용한 방법은 당신이 ... > /dev/null 2>&1을 의미했다는 것을 암시합니다.

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

나는대로이 작업을 수행 할 것

관련 문제