2010-06-14 2 views
4

대부분의 경우 0이 아닌 상태에서 오류로 중지하고 싶은 tcsh 쉘 스크립트가 있지만 어떤 경우에는 무시하고 싶습니다. 예를 들어 :tcsh 쉘 명령을 실행하고 선택적으로 상태를 무시하는 방법은 무엇입니까?

#!/bin/tcsh -vxef 

cp file/that/might/not/exist . #Want to ignore this status 
cp file/that/might/not/exist . ; echo "this doesn't work" 
cp file/that/must/exist . #Want to stop if this status is nonzero 
+1

csh 프로그래밍은 유해한 것으로 간주됩니다. 진지하게. http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ – msw

+0

비슷한 문제가 있습니다. tcsh는 내장 명령 (예 : cd 및 limit)을 외부 명령 (예 : false)과 다르게 처리하는 것 같습니다. 내장 명령은 항상 -e에 관계없이 스크립트를 종료합니다. 또한 "| 마지막 명령을 에코하지 못함"이 예상대로 작동하지 않습니다. -e 뒤에는 || 절대로 불리지 않는다. -e를 제외한 부분 || 예상대로 호출되지만 내장 명령의 경우 바로 그 스크립트를 종료합니다. 왝! –

답변

3

을 우리가 간다 : 새로운 쉘 사용을 스폰 ';' 첫 번째 상태를 무시하고 모든 값을 반환합니다.

$SHELL -c 'cp file/that/might/not/exist . ; echo "good"' 
+0

아무것도 표시하지 않으려면 "echo good"을 ":"로 바꾸는 것이 좋습니다. – macetw

+0

이 솔루션은 bash에서도 작동합니다. – macetw

3

나는 tcsh를 모르는,하지만 떠들썩한 파티와 함께, 당신은이 작업을 수행 할 set -e를 사용할 수 있습니다. -e 플래그가 설정되면 하위 명령이 실패 할 경우 bash가 즉시 종료됩니다 (자세한 내용은 설명서 참조). 설정하지 않으면 계속 실행됩니다. 실패하면 당신은 상관하지 않는 경우

set +e 
cp file/that/might/not/exist . # Script will keep going, despite error 
set -e 
cp file/that/might/not/exist . # Script will exit here 
echo "This line is not reached" 
2
mustsucceed || exit 1 
mustbeignored || : 
+0

이것은 나를 위해 작동하지 않습니다. 스크립트가 계속 중지됩니다. –

+1

@Walter 쉘을 호출 할 때'-e'를 사용하면 안됩니다. –

+0

@ 글렌 잭맨 (그가 글자의 맨 위에 말했듯이, 그는 "대부분의 시간에 0이 아닌 상태에 대한 오류로 멈추고 싶다") 이것이 우리가 '-e'문맥으로 이것을하는 이유입니다. – macetw

1

, 당신의 오두막에서 -e을 제거 : 그래서, 당신은 이런 식으로 뭔가를 할 수 있습니다. @tcsh documentation을 보았다면 Adam의 대답은 힌트를 제공해야합니다.

또한, 오류 메시지 버릴 수 있습니다 여기에

cp dont_care  . >& /dev/null 
cp still_dont_care . >& /dev/null || echo "not there" 
cp must_be_there . >& /dev/null || exit 1 # oh noes! 
+0

내가 실패하면 대부분 걱정합니다. 몇 가지 예외적 인 경우에 대해, 나는 상관하지 않는다. –

+1

'e! '가'#!/bin/tcsh -vxef'에있는 한 오류 발생시 항상 종료됩니다; 그것이'e'가하는 것입니다. 다른 행동을 취하기 위해서는'e'를 제거해야합니다. '' – frayser

관련 문제