2014-08-27 5 views
7

몇 가지 예를 통해 bash 스크립팅 및 학습을 처음 사용합니다. 내가 본 예제 중 하나는 이전에 할당 된 출력 파일이 유효한 경우 다음과 같이 테스트 할 경우 문을 사용하고 있습니다 :bash 스크립트의 if 문은 무엇을합니까?

if [ -n "$outputFile" ] && ! 2>/dev/null : >> $outputFile ; then 
    exit 1 
fi 

내가 [ -n "$outputFile" ]가 무엇을 이해하지만 조건이 아닌 나머지. 누군가가 무엇을 설명 할 수 있습니까 ! 2>/dev/null : >> $outputFile 뜻 /합니까?

나는 봤지만 대부분의 링크는 확실히 관련이 있지만 여전히 ! : >> 구조에 대해 명확하지 않은 I/O 리디렉션에 대한 설명이었습니다.

+0

어디서 봤습니까? 그리고 그것은 그것이 무엇을 말했습니까? –

+0

'[[$ outputFile]] if & [[! -w $ outputFile]]; 종료; fi' –

+0

@glennjackman :'-w'는 파일이 이미 존재한다고 가정하므로 완전히 똑같지는 않습니다. – FatalError

답변

5

이상하게 작성된 코드입니다.

: 명령은 bash에 내장되어 있습니다. true과 같습니다. 그것은, 아무것도 성공적으로 않습니다.

: >> $outputFile 

시도는 아무것도 할 수없고, $outputFile에 (빈) 출력에 추가합니다 - 이미 비어 있지 않은 문자열로 확인되었다. >> 리디렉션 연산자가 없으면 파일을 만듭니다.

2>/dev/null과 같은 입출력 방향 전환은 간단한 명령의 어느 위치 에나 나타날 수 있습니다. 그들은 끝에있을 필요가 없습니다. 따라서 : 명령 (비어 있음)의 표준 출력은 $outputFile에 추가되고 모든 stderr 출력은/dev/null로 재 지정됩니다. 이러한 stderr 출력은 : 명령 자체가 아무런 작업도 수행하지 않고 수행하지 않으므로 리디렉션에 실패한 결과입니다. $outputFile의 끝과 /dev/null에 대한 표준 오류의 리디렉션() 위에 표준 출력의 리디렉션합니다 (: 명령의 반대편에 왜 모르겠어요

! 연산자는 논리 "없다"이다. 그것을 확인 . 다음 명령이 성공하고, 그 결과를 반전 여부를

최종 결과, 영어 틱 텍스트 작성은 다음과 같습니다 "$ 출력 _이"설정하고 빈 문자열, 없는 경우

우리의 경우 쓰기 권한이 없으면 상태 1의 스크립트를 종료하십시오.간단히 말해서, 우리가 $outputFile에 글을 쓸 수 있는지 여부를 테스트하고, 그렇지 않은 경우에 보석금을냅니다.

+1

철저한 설명을 위해 하나! "stderr의 리다이렉션 (/ dev/null에 대한)이 : 명령의 반대쪽에있는 이유"에 대해 필자는 몇 가지 테스트를 수행했습니다. 읽기 전용 파일/tmp/bob이 생성되고'2/dev/null : >>/tmp/bob'과': >>/tmp/bob 2>/dev/null'을 모두 실행했습니다. 전자는 아무것도 인쇄하지 않고 후자는'bash :/tmp/bob : Permission denied'을 출력합니다. – BigHead

+0

@GongyuWang : 그것은 이상합니다. '2/dev/null : >>/tmp/bob' 다음에'$?'= 0 (그리고 빈'/ tmp/bob' 파일)이 생깁니다. '/ tmp/bob'을 디렉토리로 만들거나 쓸 수없는 파일로 만들면'$?'= 1이됩니다. (실제로 내가 당신의 전체적인 코멘트를 읽었을 때, 당신이 한 것을 깨닫게됩니다.) –

+1

@GongyuWang :': 2/dev/null >>/tmp/bob'을 사용하여 오류 메시지를 피할 수 있습니다. '2/dev/null'은'>>/tmp/bob' 앞에 와야합니다; 그것은':'명령 앞에 선행 할 필요는 없습니다. –

4

스크립트에서 $outputFile이 그리 명백한 방식으로 쓰기 가능하도록 시도하고 있습니다.

:bash의 널 (null) 명령이므로 아무것도 수행하지 않습니다. stderr/dev/null으로 리디렉션된다는 사실은 단순히 권한 거부 오류가 발생하지 않도록 억제하는 것입니다.

파일에 쓰기가 가능하지 않으면 명령이 실패하므로 !으로 무효화되고 스크립트가 종료되므로 조건이 참이됩니다.

+0

좋고 간결한 답변! 감사. – BigHead

관련 문제