다른 스크립트에 대한 스크립트를 호출하지만 자식이 exit를 호출하는 경우 부모를 종료하지 마십시오


11

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상태 감지 오류 및 종료가 -9, first.sh항상 종료합니다. 자식 셸이 종료되면 첫 번째 셸이 종료되지 않도록하려면 어떻게해야합니까?

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


.현재 셸에서 다른 파일 을 제공하는 명령을 사용하고 있습니다. 자식 셸 또는 하위 셸이 없습니다. 당신이하려고 하셨나요 실행 second.sh 하고 third.sh그들을 소싱 대신?
Celada

예 .. 대신 실행을 작성해야합니다. ./? "exit $?"를 무시하고 싶습니까? 내부 second.sh ..는 편집 second.sh없이 가능합니다?
user3589887

답변:


13

여기서하고 있는 것은 동일한 프로세스에서 실행되는 하위 스크립트를 포함 second.sh하며 third.sh쉘 프로그래밍에서 "소싱"이라고합니다. . ./second.sh기본적으로 해당 second.sh시점 의 텍스트를 포함하는 것과 같습니다 . exit명령은이 문제는 원래 스크립트 또는 소스 인 스크립트를 호출 여부를하지 않는 프로세스를 종료합니다.

당신이 원하는 모든이의 명령을 실행하는 경우 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.shthird.sh부모 스크립트를, 당신은 그들을 소싱 유지해야합니다.

return내장 종료에만 공급 스크립트가 아니라 전체 프로세스 -와 다른 스크립트를 포함한 사이의 몇 가지 차이점 중 하나의 .명령을 부모 스크립트의 텍스트를 포함. 전래 스크립트 만 호출하면 exit최상위에 내부 기능 대조적으로, 당신은 변경할 수 있습니다 exitreturn. 별명을 사용하여 스크립트를 수정하지 않고이를 수행 할 수 있습니다.

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

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

이런 이유로 '.'사용을 중단했습니다. 파일을 스크립트로 소싱하고 대신 'source'를 독점적으로 사용하십시오. bash '모범 사례'로 간주되어야하는 IMO는 코드가 수행하는 작업을 훨씬 명확하게하기 때문입니다.
Mark E. Hamilton

6

두 번째와 세 번째 쉘을 소싱하는 대신 다른 명령처럼 실행하십시오. 필요한 경우 종료 코드를 저장하고 사용할 수 있습니다.

#! /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...

STATUS1=$?이전에 발행 된 반향 명령의 결과를 포착하며 이는의 결과와 무관 ./second.sh합니다.
Cromax

@Cromax 당신은 완전히 옳습니다. 답변이 수정되었습니다.
데일 앤더슨

0

이 방법으로 시도하십시오 ( .을 호출 할 때 먼저 제거하십시오 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.