source
내부 명령이 실패할 경우 d 스크립트가 자동 반환되도록 하려면 어떻게 해야 합니까 ?
다음을 통해 실패 시 자동 종료되는 스크립트가 있다고 가정합니다 set -e
.
#!/bin/bash
# foo.env
set -e # auto-exit on any command failure
echo "hi"
grep 123 456 # this command will fail (I don't have a file named "456")
echo "should not reach here"
정상적으로 명령을 실행하면 실패한 명령이 자동으로 종료됩니다 grep
.
box1% ./foo.env
hi
grep: 456: No such file or directory
그러나 source
스크립트를 실행하면 소스되는 스크립트뿐만 아니라 현재 셸도 종료됩니다.
box1% ssh box2
box2% source ./foo.env
hi
grep: 456: No such file or directory
Connection to box2 closed.
box1%
을 제거하면 set -e
,
#!/bin/bash
# foo2.env
echo "hi"
grep 123 456 # this command will fail (I don't have a file named "456")
echo "should not reach here"
그러면 d 스크립트가 자동 종료되거나 자동 반환되지 않습니다 source
.
box1% ssh box2
box2% source ./foo2.env
hi
grep: 456: No such file or directory
should not reach here
box2%
지금까지 내가 찾은 유일한 해결 방법은 return
스크립트의 모든 코드 줄에 표현식을 추가하는 것입니다.
box1% cat foo3.env
#!/bin/bash
# foo3.env - works, but is cumbersome
echo "hi" || return
grep 123 456 || return
echo "should not reach here" || return
box1% source foo3.env
hi
grep: 456: No such file or directory
box1%
d 가 아닌 스크립트에서 작동하는 source
방식과 유사한 d 스크립트 에 대한 다른 방법이 있습니까 ?set -e
source
답변1
스크립트 는 source
키보드에서 해당 파일을 한 줄씩 작성하는 것과 같습니다. 이는 set -e
현재 쉘을 고려하고 오류가 발생하면 현재 쉘에서 종료된다는 것을 의미합니다.
이것이 해결 방법입니다. 오늘은 게으른 느낌이 들어서 컴퓨터가 나를 위해 글을 쓰거나 ||return
파일을 한 줄씩 읽고 실행하는 것이 더 낫다고 생각했습니다.
#!/bin/bash
# this is the file MySource.sh
while IFS='' read -r line
do
[[ $line == \#* ]] || $line || return
done < "$1"
그것을 실행. MySource.sh FileToBeSourced.sh
만약 당신의FileToBeSourced.sh스크립트는 작동해야 하는 한 줄 명령으로 되어 있습니다.
프로덕션 환경에서 사용할 준비가 되려면 아직 멀었습니다.
테스트해보고 결국자신의 책임하에 사용하십시오.
#
오류가 발생해야 하기 때문에 로 시작하는 줄을 건너뜁니다 # command not found
.