2010-07-25 94 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

相关问题