首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sh脚本:[程序]和[程序]与if [程序]然后[程序]

sh脚本:[程序]和[程序]与if [程序]然后[程序]
EN

Stack Overflow用户
提问于 2013-09-21 20:07:12
回答 1查看 212关注 0票数 0

我有一段代码如下:

代码语言:javascript
复制
# step through the jobs and execute them one by one
while IFS= read -r job
do
    [ -n "$job" ] && (
        script=$JOBDIR/$job.sh
        ( [ -x $script ] && /bin/sh $script ) || echo `date +%Y-%m-%d` `date +%H:%M:%S` "$script does not exist" >> $JOBFAILS
    )
done < $JOBLIST

其中(AFAIK)也可以写成:

代码语言:javascript
复制
# step through the jobs and execute them one by one
while IFS= read -r job
do
    if [ -n "$job" ] then
        script=$JOBDIR/$job.sh
        if [ -x $script ] then
            /bin/sh $script || echo `date +%Y-%m-%d` `date +%H:%M:%S` "$script does not exist" >> $JOBFAILS
        fi
    fi
done < $JOBLIST

变量是对存在的文本文件或文件夹的引用。

据我所知,()创建了一个子subshell。这是否意味着括号中的所有内容都在一个不同的过程中运行?这会对业绩产生什么影响?我还应该注意到哪些其他的差异或问题呢?

PS:如果有人能编辑标题,使之更“搜索友好”,我将不胜感激。这是我能想到的最好的描述。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 00:34:08

您是对的,( command )在子subshell中运行command。这需要分叉一个新进程,与在当前shell中运行命令相比,新进程效率更低,资源更密集。根据您的代码分叉次数,差异可能是可以忽略的,也可能不是微不足道的。

您可以重写,这也是正确的。

代码语言:javascript
复制
[ expr ] && command

作为

代码语言:javascript
复制
if [ expr ]; then
    command
fi

(请注意,如果将then放在与if相同的行上,则需要添加分号)

我建议修改您的代码以消除不必要的子subshell调用。在我看来,它们不仅比if...then效率低,而且使代码更难阅读和调试。

顺便说一句,取决于您使用的是哪个版本的shell,[可能是或不可能是shell内置的。例如,如果您正在运行Bourne的旧版本,[实际上可能调用外部程序/bin/[ (通常只是/bin/test的别名)。这会产生另一个进程及其相关的开销。但是,如果使用的是现代shell,则无需担心这一点,因为据我所知,所有现代shell都实现了内置的[命令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18937067

复制
相关文章

相似问题

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