2015-10-20 113 views
0

我爲我最喜歡的編輯器nedit寫了一個簡單的包裝腳本。它將獲取參數列表,並在一個窗口中打開所有非gzip文件,並將每個gzip文件,zcat到一個臨時文件,並在單獨的窗口中打開它們。但是,運行nedit會導致腳本等待,直到窗口關閉,即使我使用&nohup。我在這裏錯過了什麼嗎?Bash - 在後臺運行程序仍然導致腳本等待

#!/bin/bash 

declare -a nongzipped 
for file in [email protected]; do 
    if file $file | grep -q gzip; then 
     timestamp=$(date +"%F_%T") 
     tempfile="tmp_$timestamp" 
     $(zcat $file > $tempfile) 
     $(nedit -background lightskyblue3 $tempfile &) 
     $(rm $tempfile) 
    else 
     nongzipped+=("$file") 
    fi 
done 

if [ ${#nongzipped[@]} -ne 0 ]; then 
    $(nedit ${nongzipped[@]} &) 
fi 
+2

您正在過度使用命令替換;它們僅用於捕獲命令的輸出,而不是簡單地運行該命令。 – chepner

回答

4

由命令替換$(...)引起的外殼不能退出,直到它的後臺作業完成。 (比較sleep &$(sleep &)。)無論如何你都不需要它們,所以只需將它們移除即可。

if file $file | grep -q gzip; then 
    timestamp=$(date +"%F_%T") 
    tempfile="tmp_$timestamp" 
    zcat $file > $tempfile 
    nedit -background lightskyblue3 $tempfile & 
    rm $tempfile 
else 
    nongzipped+=("$file") 
fi  
+0

我想我不理解何時使用反引號或命令替換。我的印象是,在shell腳本中,您需要使用反引號或命令替換來運行外部程序,例如'ls','rm'或'zcat'。 – jktstance

+0

不,你只需要它們,如果你想捕捉輸出爲一個字符串。例如,'result = $(some_command arg1 arg2)'將'some_command'的輸出存儲在變量'result'中,'some_command「$(other_command)''捕獲'other_command'的輸出作爲參數到'some_command'。 ('some_command other_command',另一方面,會傳遞字符串「other_command」作爲參數。) – chepner

1

真的需要$(command)在這裏?此語法通常用於獲取command的輸出並將其分配給一個變量。這可能是你的腳本需要等待的原因。

你最好打電話給你的程序沒有任何特殊的語法,只是program arg1 arg2 &

相關問題