Если вы сохранили команду в строковой переменной, то для ее запуска вам нужно
eval "$cmd"
Выполнение $cmd
работает только если команда не содержит специальные символы оболочки, кроме пробелов. Сохранение команды в строковой переменной вообще плохая идея. Было бы лучше определить функцию:
cmd () {
ls -l
}
Тогда вы сможете запустить ее с помощью всего лишь cmd
.
Ваша самая непосредственная проблема заключается в том, что вы еще больше искажаете вывод команды, потому что используете подстановку команды без кавычек. Вам нужно использовать двойные кавычки для замены переменных и команд. С cmd
, определенной как функция:
echo "`cmd`"
Чтобы избежать неожиданностей со сложными командами, используйте долларовые скобки вместо обратных кавычек:
echo "$(cmd)"
См. Почему мой сценарий оболочки задыхается от пробелов или других специальных символов ? для пояснений.