Прежде всего, не храните команды в переменных.Кроме того, есть две проблемы:
- Кавычки внутри раскрываемых переменных не работают так, как если бы вы их вводили напрямую.
- Подоболочка
$()
вокруг $($CMD)
кажется подозрительной,Вы не только выполняете команду, хранящуюся в $CMD
, но также выполняете вывод этой команды!
1.Кавычки внутри переменных
Когда вы вводите команду echo "a b"
, bash
обрабатывает эту команду так, что echo
выполняется с аргументом a b
.Вывод будет a b
.
Когда вы сохраните эту команду внутри переменной и развернете ее, bash
будет обрабатывать содержимое переменной по-другому.Команда echo
будет выполнена с аргументами "a
и b"
.Вывод будет "a b"
.
Это причина сообщения об ошибке
curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""
curl
пытается открытьпуть с фактической цитатой внутри.Такой путь не существует в вашей системе.
Чтобы обойти эту проблему, вы могли бы записать eval "$cmd"
, тогда команда будет выполнена так, как если бы вы вводили ее напрямую.Тем не менее, вы действительно не должны.Вместо этого я бы переписал сценарий, чтобы не сохранял команды в переменных.
2.Оболочка вокруг $cmd
:
cmd='echo something'
$cmd
Это будет печатать something
.Тем не менее, ваш сценарий не останавливается на достигнутом, потому что вы заключили $cmd
в $()
.Поэтому вывод something
также выполняется.
cmd='echo something'
$($cmd)
приводит к
bash: something: command not found