我对bash脚本编写相当新手。我有4个嵌套的bash脚本,但我在适当地传递第四个脚本中的错误方面遇到了麻烦。例如:
script1.sh:
source script2.sh
<check for error and display appropriate message>
script2.sh:
source script3.sh param_1
<return to script1 on error>
source script3.sh param_2
<return to script1 on error>
source script3.sh param_n
<return to script1 on error>
script3.sh
<some processing>
script4.sh
echo "this statement is not reached"
return $?
script4.sh
<some processing>
exit $?
我的要求是:
- 我需要在script1中定义一个关联数组,该数组在script2中被填充并在script3的范围内可用。我认为唯一的方法是对script2和script3进行源代码引用。
- script4不是源代码,因为这个脚本也可以独立于这些父脚本之外执行。
这个线程讨论了使用return语句从已经被引用的bash脚本中返回,但由于script4是执行而非被引用的,我需要退出。我不明白为什么script4中的exit语句会导致原始shell和子shell都终止?它难道不应该只退出子shell吗?
我需要查看信号和陷阱吗?
感谢任何帮助
exit
应该只退出该子shell。也许在执行之前在你的shell中使用set -x
,并研究跟踪输出。 - gilezreturn
从被引用的文件返回,这是一个特殊情况。exit
终止进程。也许术语“子shell”让您感到困惑?子shell是执行当前shell副本的子进程,通常通过将命令放在括号( )
中来创建。我在您的代码中没有看到任何子shell。 - cdarkesource
命令不会创建子 shell。它更像是其他语言中的 include 语句。它在当前 shell 中运行代码。如果您提供一些真实的代码,我们可以解释发生了什么。 - ccartonset -e
只对那些从不检查运行任何命令的返回代码的人是一种良好的实践。只有在确切知道它如何影响脚本时,才应该使用它。我从不使用它。 - ccartonset -e
,请参考BashFAQ #105 -- 不管它是否是良好的实践,这都是一个令人意外地有争议的辩论。 - Charles Duffy