명령 실패 시 자동 반환 `source`d 스크립트

명령 실패 시 자동 반환 `source`d 스크립트

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 -esource

답변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.

관련 정보