[linux] 어떤 명령이 0이 아닌 값을 반환하면 쉘 스크립트를 중단합니까?

많은 명령을 호출하는 Bash 쉘 스크립트가 있습니다. 명령 중 하나가 0이 아닌 값을 반환하면 셸 스크립트가 반환 값 1로 자동 종료되도록하고 싶습니다.

각 명령의 결과를 명시 적으로 확인하지 않고도 가능합니까?

예 :

dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

dosomething2
if [[ $? -ne 0 ]]; then
    exit 1
fi



답변

이것을 스크립트의 시작 부분에 추가하십시오 :

set -e

단순 명령이 0이 아닌 종료 값으로 종료되면 쉘이 즉시 종료됩니다. 간단한 명령은 if, while 또는 until test 또는 && 또는 ||의 일부가 아닌 명령입니다. 명부.

자세한 내용은 “set”내부 명령 의 bash (1) 매뉴얼 페이지 를 참조하십시오.

개인적으로 “set -e”로 거의 모든 쉘 스크립트를 시작합니다. 중간에 무언가가 실패하고 스크립트의 나머지 부분에 대한 가정을 깨뜨릴 때 스크립트가 완고하게 계속되는 것은 정말 성가신 일입니다.


답변

허용 된 답변에 추가하려면 :

set -e파이프가있는 경우 특히 충분하지 않다는 것을 명심하십시오 .

예를 들어이 스크립트가 있다고 가정합니다.

#!/bin/bash
set -e
./configure  > configure.log
make

… 예상대로 작동합니다.에 오류가 발생 configure하면 실행이 중단됩니다.

내일 당신은 겉보기에 사소한 변화를 만듭니다.

#!/bin/bash
set -e
./configure  | tee configure.log
make

… 지금은 작동하지 않습니다. 이 설명 여기 및 해결 방법 (배쉬 전용) 제공됩니다

#! / bin / bash
세트 -e
-o pipefail 설정

./configure | 티 configure.log
하다


답변

예제의 if 문은 필요하지 않습니다. 다음과 같이하십시오.

dosomething1 || exit 1

Ville Laurikari의 조언을 받아 set -e다음 명령을 사용하려면 다음을 사용해야합니다.

dosomething || true

|| true명령 파이프 라인은해야 할 것입니다 true하여 있도록 명령이 실패 할 경우에도 반환 값 -e옵션은 스크립트를 죽이지 않을 것이다.


답변

종료시 정리가 필요한 경우 의사 신호 ERR과 함께 ‘트랩’을 사용할 수도 있습니다. 이것은 INT 또는 다른 신호를 포착하는 것과 같은 방식으로 작동합니다. 명령이 0이 아닌 값으로 종료되면 bash에서 ERR이 발생합니다.

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

또는 특히 “set -e”를 사용하는 경우 EXIT를 트랩 할 수 있습니다. 그러면 스크립트가 정상적인 종료, 인터럽트, -e 옵션으로 인한 종료 등 어떤 이유로 종료 될 때 트랩이 실행됩니다.


답변

$?변수가 거의 필요하지 않습니다. 의사 관용구 command; if [ $? -eq 0 ]; then X; fi는 항상로 작성해야합니다 if command; then X; fi.

$?필요한 경우 는 여러 값에 대해 점검해야하는 경우입니다.

command
case $? in
  (0) X;;
  (1) Y;;
  (2) Z;;
esac

또는 $?재사용하거나 달리 조작해야 할 경우 :

if command; then
  echo "command successful" >&2
else
  ret=$?
  echo "command failed with exit code $ret" >&2
  exit $ret
fi


답변

상단 -e또는 set -e상단에서 실행하십시오 .

또한보십시오 set -u.


답변

같은 표현

dosomething1 && dosomething2 && dosomething3

명령 중 하나가 0이 아닌 값으로 리턴되면 처리가 중지됩니다. 예를 들어 다음 명령은 “완료”를 인쇄하지 않습니다.

cat nosuchfile && echo "done"
echo $?
1