首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使shell脚本在运行时对更改的源代码具有健壮性

问如何使shell脚本在运行时对更改的源代码具有健壮性
EN

Stack Overflow用户
提问于 2010-02-18 08:08:34
回答 4查看 2.4K关注 0票数 20

人们是否注意到,如果您修改shell脚本的源代码,当前正在运行的任何实例都容易失败?

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

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

谢谢,/YGA

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-02 03:24:08

对下面的其他答案做了非常轻微的补充:

代码语言:javascript
复制
#!/bin/sh
{
    # Your stuff goes here
    exit
}

最后的exit很重要。否则,脚本文件可能仍会在最后被访问,以查看是否还有更多的行需要解释。

这个问题后来被转发到这里:Can a shell script indicate that its lines be loaded into memory initially?

票数 30
EN

Stack Overflow用户

发布于 2010-02-18 08:17:13

确保shell在执行任何文件之前必须解析整个文件:

代码语言:javascript
复制
#!/bin/ksh
{
all the original script here
}

这就起到了作用。

顺便说一句,使用Perl (我假设是Python),程序在执行任何文件之前解析整个文件,完全按照这里的建议。这就是为什么使用Perl或Python通常不会遇到这样的问题。

票数 2
EN

Stack Overflow用户

发布于 2010-02-18 08:51:35

所需的行为可能无法实现,这取决于所涉及的shell脚本的复杂性。

如果完整的shell脚本包含在单个源文件中,并且该文件在执行之前被完全解析,则shell脚本通常是安全的,不会在执行期间对磁盘上的副本进行修改。将所有可执行语句封装到一个函数(或一系列函数)中通常会达到您想要的目标。

代码语言:javascript
复制
#!/bin/sh

doit() 
{
# Stuff goes here
}
# Main
doit

当shell脚本“包括”其他shell脚本(例如,".“或"source")时,困难就来了。如果这些包含被包装在函数中,则直到在执行流中到达该语句时才对其进行解析。这使得shell脚本容易受到外部代码更改的影响。

此外,如果shell脚本运行任何外部程序(例如,shell脚本、编译程序等),则直到达到执行中的那个点(如果有的话)才会捕获该结果。

代码语言:javascript
复制
#!/bin/sh

doit() 
{
    if [[some_condition]] ; then
         resultone=$(external_program)
    fi
}
# Main
doit
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2285403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档