如何使shell脚本在运行时对源进行更改

时间:2010-02-18 00:08:34

标签: shell

有人注意到,如果修改shell脚本的来源,当前正在运行的任何实例都可能会失败吗?

这在我看来非常糟糕;这意味着我必须确保在进行更改之前停止脚本的所有实例。我的首选行为是现有脚本继续使用旧源代码运行,新实例使用新代码(例如perl和python程序会发生什么)。

除了将shell脚本预先复制到临时文件并从中运行之外,人们对此行为有什么好的解决方法吗?

谢谢, / YGA

3 个答案:

答案 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