이 스크립트가 명령 상태를 확인하고 실패 시 종료되도록 하려면 어떻게 해야 합니까?
#!/bin/sh
echo JFFS2 Preparation
cd /root
/root/config 1 > /root/formatted
if grep "PAR_JFFS2_FORMATTED = -1" /root/formatted; then
echo Need to Format MTD2
rm -f /root/formatted
flash_eraseall -j /dev/mtd2
echo Marking file system as formatted
/root/config 1 1355270400
mount -t jffs2 -o noatime /dev/mtdblock2 /mnt
echo "Formmatted" > /mnt/formatted.txt
else
mount -t jffs2 -o noatime /dev/mtdblock2 /mnt
fi
답변1
set -e
이를 스크립트 앞부분에 추가하거나 #!
줄을 로 변경 #!/bin/sh -e
하면 동일한 효과가 나타납니다.
이는 errexit
쉘 옵션을 설정합니다. 즉, 다음 예외를 제외하고 명령이 0이 아닌 종료 상태를 반환하는 즉시 스크립트가 종료됩니다(에서 가져옴).POSIX 설명set
):
다중 명령 파이프라인에서 단일 명령이 실패하더라도 셸이 종료되어서는 안 됩니다. 파이프라인 자체의 오류만 고려됩니다.
-e
, 또는 예약어 뒤의 복합 목록, 예약어로 시작하는 파이프 또는 마지막 AND-OR 목록을 제외한 모든 명령을 실행할 때 이 설정은 무시되어야 합니다.while
until
if
elif
!
-e
이는 종료 상태가 무시 시 실패의 결과인 경우 하위 쉘 명령 이외의-e
복합 명령에는 적용되지 않습니다 .
|| exit
또 다른 방법은 각 명령 뒤에 실패할 경우 종료하려는 명령을 추가하는 것입니다 . 예를 들어
flash_eraseall -j /dev/mtd2 || exit
답변2
Bash의 모든 명령 이후의 반환 코드는 $?
변수에 저장됩니다. 명령이 성공한 경우 해당 값은 다음과 같아야 합니다.
successfulcommand
echo $?
0
오류가 발생하면 결과는 0이 아니며 오류에 따라 달라집니다.
unsuccessfulcommand
echo $?
2