다른 스크립트에 대한 스크립트를 호출하지만 하위 스크립트가 종료를 호출하는 경우 상위 스크립트를 종료하지 마십시오.

다른 스크립트에 대한 스크립트를 호출하지만 하위 스크립트가 종료를 호출하는 경우 상위 스크립트를 종료하지 마십시오.

first.sh:

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

second.sh오류가 감지 되면 first.sh항상 종료 하고 -9 상태로 종료됩니다. 서브쉘이 종료되면 첫 번째 쉘에서 종료되는 것을 방지하는 방법은 무엇입니까?

편집할 수 없습니다 second.sh.

답변1

여기서 수행하는 작업은 second.shthird.sh쉘 프로그래밍에서 "소싱"이라고 하는 동일한 프로세스에서 실행되는 첨자로 처리하는 것입니다. 기본적으로 당시의 텍스트를 . ./second.sh포함하는 것과 동일합니다 . second.shexit명령은 프로세스를 종료하며 원본 스크립트에서 호출하든 소스 스크립트에서 호출하든 상관없습니다.

및 에서만 명령을 실행하고 원래 스크립트의 변수 및 함수에 액세스하거나 수정할 필요가 없는 경우 second.sh해당 third.sh스크립트를 하위 프로세스로 호출하십시오.

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

원본 스크립트의 변수와 함수를 수정하지 않고 액세스하기 위해 다른 스크립트가 필요한 경우 하위 쉘에서 해당 스크립트를 호출하세요. 서브쉘은 별도의 프로세스이므로 exit종료하면 됩니다.

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"

상위 스크립트에 정의된 변수나 함수를 사용해야 하는 경우 second.sh계속 third.sh해서 가져와야 합니다.

내장 함수는 전체 프로세스가 아닌 소스 스크립트만 종료합니다. 이는 명령에 다른 스크립트를 포함하는 것과 상위 스크립트에 해당 텍스트를 포함하는 것의 return몇 가지 차이점 중 하나 입니다. .소스 스크립트가 exit내부 기능이 아닌 최상위 수준에서만 호출되는 경우 스크립트를 수정하지 않고도 별칭을 사용하여 exit이를 return수행할 수 있습니다.

#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"

if 를 exit내부 함수라고도 하는데 문제 없이 할 수 있는 방법은 없을 것 같습니다. 번거로운 접근 방식 중 하나는 종료 트랩을 설정하고 거기에 코드를 넣는 것입니다.

#!/bin/ksh
do_first () {
  echo "prova"
  trap "after_second" EXIT
  . ./second.sh
  after_second
}
after_second () {
  echo "ho lanciato il secondo"
  trap "after_third" EXIT
  . ./third.sh
  after_third
}
after_third () {
  trap - EXIT
  echo "ho lanciato il terzo"
}
do_first

답변2

두 번째 및 세 번째 셸을 얻을 필요가 없으며 다른 명령처럼 실행하면 됩니다. 원하는 경우 종료 코드를 다음과 같이 저장하고 사용할 수 있습니다.

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...

답변3

다음을 시도해 보세요( .전화할 때 먼저 제거 second.sh).

first.sh:

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

이는 .단축 코드 로 source인해 두 번째 스크립트가 첫 번째 스크립트의 일부로 포함되기 때문입니다.

답변4

script1.sh

  1 PWD="/scratch/currdir"
  2 echo "Hello from scrpt 1"
  3
  4 sh $PWD/script2.sh # We will exit in script2.sh and see if line 6 gets printed
  5
  6 echo "From script 1: After scrpt2 call"
  7 exit 0

script2.sh

  1 echo "Hello from script 2"
  2
  3 exit 1
  4 echo "This should not get printed"

산출:

-bash-4.1$ sh script1.sh
Hello from scrpt 1
Hello from script 2
From script 1: After scrpt2 call

(참고: script2(3행, 종료 1)를 종료했지만 여전히 script1.sh에 있습니다. 6행은 script2.sh를 호출한 후 실행됩니다.

도움이 되었기를 바랍니다.

관련 정보