我有一段代码如下:
# 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:如果有人可以将标题编辑为更“搜索友好”,我会很感激。这是我能想到的最佳描述。答案 0 :(得分:1)
你是对的,( command )
在子shell中运行command
。这需要分支新进程,这比在当前shell中运行命令效率低且资源密集。根据您的代码分叉的次数,差异可能会或可能不会忽略不计。
你也可以改写
[ expr ] && command
作为
if [ expr ]; then
command
fi
(请注意,如果您将then
放在与if
相同的行上,则需要添加分号)
我建议您更改代码以摆脱不必要的子shell调用。在我看来,它们不仅效率低于if...then
,而且还使代码更难以阅读和调试。
顺便说一句,根据您使用的shell的版本,[
可能是也可能不是shell内置的。例如,如果您正在运行旧版本的Bourne shell,[
实际上可能会调用外部程序/bin/[
(通常只是/bin/test
的别名)。这产生了另一个具有相关开销的进程。但是,如果您使用现代shell,则不必担心这一点,因为据我所知,所有现代shell都实现了内置的[
命令。