有人注意到,如果修改shell脚本的来源,当前正在运行的任何实例都可能会失败吗?
这在我看来非常糟糕;这意味着我必须确保在进行更改之前停止脚本的所有实例。我的首选行为是现有脚本继续使用旧源代码运行,新实例使用新代码(例如perl和python程序会发生什么)。
除了将shell脚本预先复制到临时文件并从中运行之外,人们对此行为有什么好的解决方法吗?
谢谢, / YGA
答案 0 :(得分:17)
对以下其他答案的补充非常轻微:
#!/bin/sh
{
# Your stuff goes here
exit
}
最后exit
很重要。否则,可能仍会在末尾访问脚本文件,以查看是否还有其他行要解释。
此问题稍后在此处重新发布:Can a shell script indicate that its lines be loaded into memory initially?
答案 1 :(得分:2)
确保shell在执行任何文件之前必须解析整个文件:
#!/bin/ksh
{
all the original script here
}
这就是诀窍。
顺便说一句,使用Perl(我假设是Python),程序会在执行任何文件之前解析整个文件,完全按照此处的建议。这就是为什么你通常不会遇到Perl或Python的问题。
答案 2 :(得分:2)
可能无法实现所需的行为,具体取决于所涉及的shell脚本的复杂性。
如果完整的shell脚本包含在单个源文件中,并且该文件在执行前已完全解析,那么shell脚本通常可以在执行期间修改光盘上的副本。将所有可执行语句包装到函数(或一系列函数)中通常会实现您所追求的目标。
#!/bin/sh
doit()
{
# Stuff goes here
}
# Main
doit
当shell脚本“包含”其他shell脚本(例如“。”或“source”)时,会遇到困难。如果这些包含在函数中,则在执行流程中达到该语句之前不会对它们进行解析。这使得shell脚本容易受到外部代码的更改。
此外,如果shell脚本运行任何外部程序(例如shell脚本,编译程序等),则在达到执行中的该点(如果有)之前不会捕获该结果。
#!/bin/sh
doit()
{
if [[some_condition]] ; then
resultone=$(external_program)
fi
}
# Main
doit