bash + 보조 스크립트와 메인 스크립트를 동시에 종료하는 방법

bash + 보조 스크립트와 메인 스크립트를 동시에 종료하는 방법

script1우리는 다음에서 스크립트를 실행합니다.script_main

script_main:

#!/bin/bash
/tmp/script1
echo $?

sleep 2
echo script ended 

script1:

#!/bin/bash
exit 1

분명히 script1종료 코드는 1이지만 기본 스크립트는 끝까지 계속 실행됩니다.

내 질문: 언제 script1즉시 exit 1중지 할 수 있나요 main_script?

답변1

가장 간단한 방법은 exit다른 스크립트가 실패할 때 첫 번째 스크립트를 명시적으로 사용하는 것입니다. 조건에 스크립트 실행을 넣습니다.

otherscript.sh || exit 1

또는

if ! otherscript.sh ; then
      ret=$?
      echo "otherscript failed with exit code $ret. exit." >&2
      exit 1
fi

이렇게 하면 기본 스크립트가 원하는 정리를 수행하거나 하위 프로세스의 종료 코드에 따라 다른 솔루션을 시도할 수 있습니다. 첫 번째에서는 || exitjust , 를 사용하여 하위 프로세스의 종료 코드를 전달할 수 있습니다.

기본 스크립트를 종료하려면어느명령이 시작되지 않고 set -e.

set -e
otherscript.sh
echo "this will not run if otherscript fails"

set -e조건부 구조 내에서 실행되는 프로그램에서는 작동하지 않으므로 특정 코드를 테스트하거나 오류를 무시하도록 추적할 수 있습니다 || true. 그러나 이제 종료 지점이 어디에나 있으므로 trap somecmd EXIT쉘이 종료되기 전에 어디서 발생하더라도 정리 작업을 수행할 수 있습니다.


내부 스크립트를 사용하여 기본 스크립트를 강제로 종료하는 것도 가능하지만 이는 약간 비우호적이며 일반적인 응용 프로그램에서는 이를 수행할 것으로 기대하지 않습니다. 그러나 원하는 경우 내부 스크립트가 단순히 상위 프로세스를 촬영하도록 하는 것도 한 가지 방법입니다.

$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID

$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated

여기에서 대화형 셸에서 실행하면 otherscript.sh대화형 세션을 캡처하려고 시도합니다. SIGTERM그러나 내가 테스트한 모든 쉘은 대화식으로 실행될 때 이를 무시하는 것 같습니다. 그럼에도 불구하고 메인 쉘은 다시 trap사용할 수 있습니다 SIGTERM.

kill 0단순히 상위 프로세스를 잡는 대신 실행 중인 프로세스 그룹의 모든 프로세스를 종료하는 방법을 사용할 수 있습니다 otherscript.sh. 비대화형 쉘에서 실행되는 경우 일반적으로 상위 프로세스가 포함됩니다.

답변2

소스를 사용할 수 있습니다 script 2. 좋다:

. /tmp/script1.sh

종료 코드를 읽어 script2프로세스를 종료합니다.

➜  /tmp cat script.sh 
#!/bin/bash

echo "Running ${0} with pid $$"
. /tmp/script1.sh
echo $?
echo "This code won't execute"
sleep 2
echo "Script ${0} ended"
echo "This code won't execute"
sleep 2

echo "Script ${0} ended"



➜  /tmp cat script1.sh 
#!/bin/bash

echo "Running ${0} with pid $$"
exit 5

실행하세요:

➜  /tmp ./script.sh 
Running ./script.sh with pid 10306
Running ./script.sh with pid 10306
➜  /tmp echo $?
5

관련 정보