2013-09-21 83 views
0

我有一段代码如下:SH脚本:[方案] && [程序]对如果[程序]然后[程序]

# 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)也可以写为:

# 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 

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

据我所知,()创建一个子shell。这是否意味着括号中的所有内容都运行在不同的过程中?那会对性能产生什么影响? 我应该注意哪些其他区别或陷阱?

PS:如果有人可以将标题编辑为“搜索友好”,我会很感激。这是我能想出的最好的描述。

回答

1

你是对的,(command)在子外壳中运行command。这需要分叉一个新的进程,这比在当前shell中运行该命令效率较低且资源密集。这种差异可能会或可能不会被忽略,具体取决于代码分叉的次数。

你也是正确的,你可以重写

[ expr ] && command 

if [ expr ]; then 
    command 
fi 

(注意,如果你把then在同一行if,你需要添加一个分号)

我会建议改变你的代码来摆脱不必要的子shell调用。在我看来,它们不仅比if...then效率低,而且使代码更难读取和调试。

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