2009-09-04 6 views
11

나는 bash 스크립트를 작성 중이므로 errexit을 설정 했으므로 명령이 0 종료 코드를 리턴하지 않으면 (즉, 명령이 성공적으로 완료되지 않은 경우) 스크립트가 종료되도록 설정됩니다. 이것은 나의 bash 스크립트가 튼튼하다는 것을 확인하는 것이다.Bash 스크립트 - 장치를 마운트 해제했으나 마운트되지 않은 경우 실패하지 않습니까?

일부 파일 시스템을 마운트하고 일부 파일을 복사하고 마운트 해제해야합니다. 나는 시작하기 전에 umount /mnt/temp을 끼워 넣기 때문에 아무것도하지 않기 전에 언 마운트한다. 그러나 마운트되지 않은 경우 umount가 실패하고 스크립트가 중지됩니다.

umount --dont-fail-if-not-mounted /mnt/temp 할 수 있습니까? 장치가 마운트되지 않은 경우 0을 반환합니다. rm -f처럼? 장치가 장착되지 않은 경우 귀하의 umount 반환, 당신이 할 수있는 일이라고 가정

umount .... || /bin/true 

답변

28

리턴 코드를 무시하는 표준 트릭은 항상 성공을 평가하는 부울 표현식에서 명령을 래핑하는 것입니다 그런 그 :

umount … || [ $? -eq 1 ] 

다른 코드가 반환되면 다음 배쉬는 umount 반환 0 또는 1 (즉, 성공적으로 마운트 해제 또는 장치가 장착되지 않은) 경우 오류지지 않습니다하지만 스크립트를 중지합니다 (예를 들어, 당신이 아니오 d를 마운트 해제 할 수있는 권한 evice).

+1

및 출력을/dev/null로 리디렉션합니다. umount ...>/dev/null 2> & 1 ||/bin/true – knittl

+0

글쎄, 그것은 상황에 맞는 일입니다. 스크립트를 계속하고 싶지만 로그 메시지에 오류 메시지를 남기는 것은 쉽습니다. –

+6

/bin/true 대신 새로운 의사 명령어':'(쉘 내장 명령)를 사용하여 좀 더 빠르게 만들 수 있습니다. 즉, "umount .... || :'"를 사용하십시오. –

5

을 :

+1

테스트하고 umount는 사용량이 많고 마운트되지 않은 경우 리턴 코드 1로 종료되므로 리턴 코드만으로 두 경우를 구별 할 수 없습니다. –

2

방금 ​​":"이 (가) 더 많이 사용되어 유사한 해결책을 원했지만 스크립트에 무슨 일이 일어나는지 알았습니다.

umount ...... || { echo "umount failed but not to worry" ; : ; } 

umount가 실패했지만 메시지에 true를 반환합니다.

+0

대부분의 경우 "/ bin/true"를이 용도로 사용하는 것이 더 유용합니다. 그러면 의미를 읽고 읽는 것이 더 쉬워집니다. – anydot

+0

'{}'및'; : '여기에 여분이 있습니까? 만약'false이면 || 에코 1; then echo ok; fi'이고 출력은'false이면 || {에코 1; :; }; then echo ok; fi'. – Desty