为另一个脚本调用一个脚本,但如果子进程调用 exit 则不要退出父进程

use*_*887 16 shell shell-script exit

first.sh

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"
Run Code Online (Sandbox Code Playgroud)

second.sh

echo "sono nel secondo script"
dosomething1
exit $?
Run Code Online (Sandbox Code Playgroud)

如果second.sh检测到错误并以状态 -9first.sh退出,则始终退出。如果子 shell 退出,我如何避免从第一个 shell 退出?

我无法编辑second.sh

Gil*_*il' 19

您在这里所做的是包含second.shthird.sh作为在同一进程中运行的子脚本,这在 shell 编程中称为“采购”。. ./second.sh基本上等同于包含当时的文本second.sh。该exit命令退出进程,无论您是在原始脚本中还是在源脚本中调用它都没有关系。

如果您只想运行second.shand 中的命令,third.sh并且它们不需要访问或修改原始脚本中的变量和函数,请将这些脚本称为子​​进程。

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Run Code Online (Sandbox Code Playgroud)

如果您需要其他脚本从原始脚本访问变量和函数,但不修改它们,则在子 shell 中调用这些脚本。Subshel​​l 是单独的进程,因此exit仅退出它们。

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Run Code Online (Sandbox Code Playgroud)

如果您需要使用定义的变量或函数second.sh,并third.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"
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)


Dal*_*son 7

而不是采购第二个和第三个 shell,只需像运行任何其他命令一样运行它们。如果需要,可以存储和使用退出代码,如下所示:

#! /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...
Run Code Online (Sandbox Code Playgroud)