人们是否注意到,如果您修改shell脚本的源代码,当前正在运行的任何实例都容易失败?
在我看来,这是非常糟糕的;这意味着我必须确保在进行更改之前停止脚本的所有实例。我的首选行为是现有的脚本继续使用旧的源代码运行,而新的实例使用新的代码(例如,perl和python程序会发生什么情况)。
除了将shell脚本预先复制到临时文件并从中运行之外,对于这种行为,人们有什么好的解决方法吗?
谢谢,/YGA
发布于 2010-03-02 03:24:08
对下面的其他答案做了非常轻微的补充:
#!/bin/sh
{
# Your stuff goes here
exit
}最后的exit很重要。否则,脚本文件可能仍会在最后被访问,以查看是否还有更多的行需要解释。
这个问题后来被转发到这里:Can a shell script indicate that its lines be loaded into memory initially?
发布于 2010-02-18 08:17:13
确保shell在执行任何文件之前必须解析整个文件:
#!/bin/ksh
{
all the original script here
}这就起到了作用。
顺便说一句,使用Perl (我假设是Python),程序在执行任何文件之前解析整个文件,完全按照这里的建议。这就是为什么使用Perl或Python通常不会遇到这样的问题。
发布于 2010-02-18 08:51:35
所需的行为可能无法实现,这取决于所涉及的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
doithttps://stackoverflow.com/questions/2285403
复制相似问题