많은 명령을 호출하는 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
