set -e 명령은 명령이 0이 아닌 종료 코드를 리턴 할 때 bash 스크립트가 즉시 실패하게합니다.
스크립트 내에서 개별 명령에 대해이 동작을 사용하지 않는 쉽고 우아한 방법이 있습니까?
이 기능은 Bash Reference Manual ( http://www.gnu.org/software/bash/manual/bashref.html )에 어디에 기록되어 있습니까?
set -e 명령은 명령이 0이 아닌 종료 코드를 리턴 할 때 bash 스크립트가 즉시 실패하게합니다.
스크립트 내에서 개별 명령에 대해이 동작을 사용하지 않는 쉽고 우아한 방법이 있습니까?
이 기능은 Bash Reference Manual ( http://www.gnu.org/software/bash/manual/bashref.html )에 어디에 기록되어 있습니까?
답변:
이 같은:
#!/usr/bin/env bash
set -e
echo hi
# disable exitting on error temporarily
set +e
aoeuidhtn
echo next line
# bring it back
set -e
ao
echo next line
운영:
$ ./test.sh
hi
./test.sh: line 7: aoeuidhtn: command not found
next line
./test.sh: line 11: ao: command not found
set
내장 도움말에 설명되어 있습니다 .
$ type set
set is a shell builtin
$ help set
(...)
Using + rather than - causes these flags to be turned off.
https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin에 동일하게 문서화되어 있습니다 .
실수로 보석금을 해제하는 대안은 무엇이든 성공을 거두는 것입니다. 다음과 같이 할 수 있습니다 :
cmd_to_run || true
0을 반환하므로 (-e) set -e가 트리거되지 않아야합니다.
faulty_cmd || :
이것에 대한 또 다른 인기있는 관용구입니다. (와 :
동의어입니다 true
).
"즉시 쉘 종료 옵션"이 적용되거나 무시되는 경우 실행 된 명령의 컨텍스트에 따라 다릅니다 ( Arkadiusz Drabczyk 덕분에 기본 제공 세트의 Bash 참조 매뉴얼 섹션 참조 ).
특히 명령이 if 문의 테스트의 일부인 경우이 옵션은 무시됩니다. 따라서 다음과 같은 if 문을 사용하여 "즉시 종료 컨텍스트"내에서 명령을 실행하고 성공 또는 실패를 확인할 수 있습니다.
#!/bin/bash
set -e
# Uncomment next line to see set -e effect:
#blubb
if blubb; then
echo "Command blubb was succesful."
else
echo "Command blubb failed. Exit code: $?"
fi
echo "Script exited normally."
"then"문을 생략하고 더 적은 행을 사용할 수 있습니다.
if blubb; then :;
else echo "Command blubb failed. Exit code: $?"; fi
실제로 최근에 비슷한 질문이 있었지만 (게시하지는 않았지만), 내가 볼 수 있듯이 명령 전에 set + e를 사용하고 나중에 set -e를 사용하면 가장 우아하게 작동합니다. 다음은 명령의 응답을 잡아서 오류가 발생하지 않도록하는 예입니다.
#!/bin/sh
args=""
for argcol in $*
do
args="${args} ${argcol}"
done
fortunevar=""
fortfail=""
{
set +e
fortunevar=`fortune $args`
fortfail=$?
set -e
} &> /dev/null
if [ $fortfail == 0 ]
then
echo ${fortunevar}
say ${fortunevar}
else
echo misfortune: an illegal option was detected!
echo misfortune: usage: misfortune [-afilosw] [-m pattern][ [#%] file/directory/all]
fi
이것은 '포춘'의 출력을 잡고 종료 상태를 확인하고 반향하여 알려줍니다. 나는 이것이 당신이 요구 한 것이거나 적어도 비슷한 것이라고 생각합니까? 어쨌든 이것이 도움이되기를 바랍니다.