2010-07-25 85 views
0
DOWNLOAD_PATH="sample.ext" 
RATE_LIMIT="300K" 
mkdir ../$DOWNLOAD_PATH 
BASE_COMMAND="screen wget --continue --directory-prefix=../$DOWNLOAD_PATH --tries=2 --input-file=$DOWNLOAD_PATH" 
$("${BASE_COMMAND} --limit-rate=${RATE_LIMIT}") 

這並不工作,但將引發一個錯誤:爲什麼包含的代碼在bash中不起作用?

line 5: screen wget --continue --directory-prefix=../sample.ext --tries=2 --input-file=sample.ext --limit-rate=300K: No such file or directory 

但是,如果我做

DOWNLOAD_PATH="sample.ext" 
RATE_LIMIT="300K" 
mkdir ../$DOWNLOAD_PATH 
BASE_COMMAND="screen wget --continue --directory-prefix=../$DOWNLOAD_PATH --tries=2 --input-file=$DOWNLOAD_PATH" 
COMPLETE_COMMAND="${BASE_COMMAND} --limit-rate=${RATE_LIMIT}" 
$($COMPLETE_COMMAND) 

一切工作就好了... ... 爲什麼呢?

+0

你爲什麼把所有的東西放在變量中?參見[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 – 2010-07-25 21:32:47

+0

我在我的腳本中的多個地方使用該命令,並希望能夠集中更改它... – meanandvicious 2010-07-25 22:10:24

回答

4

因爲當你把"${BASE_COMMAND} --limit-rate=${RATE_LIMIT}"放在引號中時,bash將它解釋爲一個單詞並試圖找到一個帶有這個名字的命令。它正在尋找一個程序,字面上有名字

screen wget --continue --directory-prefix=../sample.ext --tries=2 --input-file=sample.ext --limit-rate=300K 

空間和所有。顯然這並不存在。解決方法是不加引號,因此bash會將其解釋爲空格分隔的單詞列表,並理解命令本身只是screen

順便說一句,除非您嘗試捕獲命令的輸出,否則不需要使用$()。這會很好:

DOWNLOAD_PATH="sample.ext" 
RATE_LIMIT="300K" 
mkdir ../$DOWNLOAD_PATH 
BASE_COMMAND="screen wget --continue --directory-prefix=../$DOWNLOAD_PATH --tries=2 --input-file=$DOWNLOAD_PATH" 
${BASE_COMMAND} --limit-rate=${RATE_LIMIT} 
+0

謝謝!解決了它。我真的應該更多地瞭解bash腳本,這樣我就不會像這樣重複愚蠢的錯誤...... – meanandvicious 2010-07-25 18:56:25

相關問題