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.sh
并third.sh
作为在同一进程中运行的子脚本,这在 shell 编程中称为“采购”。. ./second.sh
基本上等同于包含当时的文本second.sh
。该exit
命令退出进程,无论您是在原始脚本中还是在源脚本中调用它都没有关系。
如果您只想运行second.sh
and 中的命令,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 中调用这些脚本。Subshell 是单独的进程,因此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
在顶层调用,而不是内部函数,那么您可以更改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"
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)
而不是采购第二个和第三个 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)