Почему включенный код не работает в bash? - PullRequest
0 голосов
/ 25 июля 2010
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}")

Это не работает, но выдает ошибку:

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)

все работает просто отлично ... Почему?

1 Ответ

4 голосов
/ 25 июля 2010

Потому что, когда вы помещаете "${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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...