2012-09-11 13 views
17

나는 내 머리를 감쌀 수 없다. /dev/nullif 문에 대한 입력으로 사용하는 이유는 무엇입니까? 다음에서 < /dev/null의 용도는 무엇입니까?if()</ dev/null

if ($PROG --version) </dev/null> /dev/null 2>&1; then 
     $PROG 
else 
     echo "failed" 
     exit 1 
fi 

I (생각) 나는 > /dev/null 2>&1 그냥 stdoutstderr 모두에서 출력을 억제하기 위해 사용되는 것으로 알고 있습니다. $PROG 만약

답변

15

당신이 뭔가를 입력을 기다리고, 스크립트 영원히 멈출 수 stdin에서 입력이 있어야하는 프로그램입니다. < /dev/null의 사용은 프로그램에 빈 입력을 제공하는 것입니다. >2>&1에 대해 옳습니다.

이 스 니펫 스크립트는 $PROG --version이 0 상태 (성공)로 종료되었는지 확인한 다음 플래그없이 해당 프로그램을 실행합니다. $PROG --version이 실패하면 스크립트는 "실패"를에 C하고 종료합니다.

+0

감사합니다. 나는'$ PROG'가 무엇인지 알고 있고'PROG --version'이 입력을 기다리지 않고 있다는 것을 알고 있다면 이것이 얼마나 유용한 지 아직 확실하지 않습니다. 예를 들어,'PROG = autoconf'는 내가 이것을 보았던 곳입니다.그리고 나는'autoconf --version'이 입력을 기다리지 않고 있다는 것을 알고 있습니다. 이 경우에도 여전히 유용합니까? –

+0

@Carl Norum, 명령을 실행하기 위해'if ('$ PROG --version')'(꺽쇠 괄호)를 사용할 수 있고'/ dev/null'을 쓸 필요가 없습니까? – fduff

+0

꺾쇠 괄호? –

13

왜 리디렉션이 괄호 밖에 있는지 궁금합니다. 이 라인에서

는 :

if ($PROG --version) </dev/null> /dev/null 2>&1; then 

괄호는 if 문의 구문의 일부가 아닌; 그들은 단지 명령 그룹을 지정합니다. (그것은 자신이 기억하는 나에게 순간을했다; CSH/tcsh가, if 문의 구문의 일부 괄호.) 예를 들어

이 :

(echo one ; echo two) | tr a-z A-Z 

이 출력을 생성 : $PROG --version 이후이 경우

ONE 
TWO 

는, 하나의 명령이다, ( $PROG 하나 이상의 명령으로 확장하지 않는 한,하지만 같지도) 괄호는 필요하지 않습니다.

따라서 리디렉션은 if 문에는 적용되지 않습니다. $PROG --version에 적용됩니다. 그 목적은 빈 파일에서 읽는 것처럼 입력을 제공하지 않고 $PROG으로 제공하고 stdout 또는 stderr에 쓰는 내용을 무시합니다. $PROG이 stdin에서 읽는 명령 인 경우 --version으로 호출해도 입력 리디렉션없이 키보드 입력을 기다릴 수 있습니다.

$PROG (무엇이든지간에) $PROG --version이 오류를 생성하지 않는 경우에만 스크립트를 호출하는 것이 안전하다고 가정합니다. 당신이 if 문에 재 지정을 적용 할 수 있습니다

참고 :

if test_command ; then 
    something 
else 
    something_else 
fi </dev/null> /dev/null 2>&1 

test_command, something, something_else에 대한 입력 및 출력을 리디렉션합니다.

+0

멋진 답변을 보내 주셔서 감사합니다. 나는 괄호에 관해 정말로 혼란스러워했다. 저를 위해 그것을 깨고 예제를 주셔서 감사합니다. 좋은 설명. –