2013-09-21 29 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的別名)。這產生了另一個與其相關聯的開銷的進程。但是,如果您使用的是現代外殼,則不必擔心這一點,因爲據我所知,所有現代外殼都實現了內置的[命令。