답변:
이것을 스크립트의 시작 부분에 추가하십시오 :
set -e
단순 명령이 0이 아닌 종료 값으로 종료되면 쉘이 즉시 종료됩니다. 간단한 명령은 if, while 또는 until test 또는 && 또는 ||의 일부가 아닌 명령입니다. 명부.
자세한 내용은 "set"내부 명령 의 bash (1) 매뉴얼 페이지 를 참조하십시오.
개인적으로 "set -e"로 거의 모든 쉘 스크립트를 시작합니다. 중간에 무언가가 실패하고 스크립트의 나머지 부분에 대한 가정을 깨뜨릴 때 스크립트가 완고하게 계속되는 것은 정말 성가신 일입니다.
bash script.sh
.
set -e; tf() { false; }; tf; echo 'still here'
.. set -e
의 본문이 없어도 tf()
실행이 중단됩니다. 아마도 당신은 그것이 subshells 에 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 하다
pipefail
함께 가야 하는 중요성을 설명해 주셔서 감사합니다 set -o
!
예제의 if 문은 필요하지 않습니다. 다음과 같이하십시오.
dosomething1 || exit 1
Ville Laurikari의 조언을 받아 set -e
다음 명령을 사용하려면 다음을 사용해야합니다.
dosomething || true
는 || true
명령 파이프 라인은해야 할 것입니다 true
하여 있도록 명령이 실패 할 경우에도 반환 값 -e
옵션은 스크립트를 죽이지 않을 것이다.
set -e
bash 중심이 아닙니다-원래 Bourne Shell에서도 지원됩니다.
종료시 정리가 필요한 경우 의사 신호 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
.
help set
: -u
설정되지 않은 변수에 대한 참조를 오류로 처리합니다.
set -u
또는 set -e
둘 다하지? @lumpynose
Mark Edgars 입력에 대한 추가 질문이 있었고 여기에 추가 예제가 있으며 전반적인 주제에 대해 설명하기 때문에 참조를 위해 다른 질문을 던졌습니다.
[[ `cmd` ]] && echo success_else_silence
그것은 cmd || exit errcode
누군가가 보여준 것과 같습니다 .
예. 마운트 된 경우 파티션이 마운트 해제되었는지 확인하고 싶습니다.
[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1
[[
cmd`]]`는 같은 것이 아닙니다. 명령의 출력 상태가 비어 있으면 명령의 출력이 비어 있으면 false이고 그렇지 않으면 true입니다.
set -e
도 수행하십시오 . 존재하지 않는 변수에 액세스 할 수 있고 진단없이 빈 값을 생성 할 수있는 바보 같은 버그 숨김 동작을 종료합니다.set -u
set -eu
-u