0

我有一段代码如下:

# 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:如果有人可以将标题编辑为更“搜索友好”,我将不胜感激。这是我能想到的最好的描述。

4

1 回答 1

1

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

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

[ expr ] && command

作为

if [ expr ]; then
    command
fi

(注意如果和 放在then同一行if,需要加分号)

我建议更改您的代码以摆脱不必要的子外壳调用。在我看来,它们不仅效率低于if...then,而且还使代码更难阅读和调试。

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

于 2013-09-23T00:34:08.597 回答