Как включить разделение новой строки при выполнении команды `ls -l`, когда stdout не является терминалом

Я сохраняю команду в переменной cmd, и получаю вывод команды с помощью этого оператора:

echo `$cmd`

все работает нормально, кроме ls -l, новая строка отсутствует.

0
04.06.2017, 01:22
1 ответ

Если вы сохранили команду в строковой переменной, то для ее запуска вам нужно

eval "$cmd"

Выполнение $cmd работает только если команда не содержит специальные символы оболочки, кроме пробелов. Сохранение команды в строковой переменной вообще плохая идея. Было бы лучше определить функцию:

cmd () {
  ls -l
}

Тогда вы сможете запустить ее с помощью всего лишь cmd.

Ваша самая непосредственная проблема заключается в том, что вы еще больше искажаете вывод команды, потому что используете подстановку команды без кавычек. Вам нужно использовать двойные кавычки для замены переменных и команд. С cmd, определенной как функция:

echo "`cmd`"

Чтобы избежать неожиданностей со сложными командами, используйте долларовые скобки вместо обратных кавычек:

echo "$(cmd)"

См. Почему мой сценарий оболочки задыхается от пробелов или других специальных символов ? для пояснений.

1
28.01.2020, 02:45

Теги

Похожие вопросы