Передача многострочного вывода команды в эхо выводит только одну строку

У меня есть 2 файла в моей папке, как показано ниже

$ ls -l
total 1
-rw-r--r-- 1 user user-group 0 May 10 14:49 test
-rw-r--r-- 1 user user-group 0 May 10 14:49 test1

Список файлов отображается нормально. Но почему команда ниже показывает обе строки, объединенные в одну строку в bash?

$ echo `ls -l`
total 1 -rw-r--r-- 1 user user-group 0 May 10 14:49 test -rw-r--r-- 1 user user-group 0 May 10 14:49 test1

person Deepak Janyavula    schedule 10.05.2017    source источник
comment
Прочтите разделение слов, расширение глоба, что такое $() и так далее...   -  person heemayl    schedule 10.05.2017


Ответы (2)


Поскольку вы используете здесь подстановку команд и эхо, чтобы эхо отображало ваш вывод на нескольких строках, вам нужно будет заключить вывод в кавычки.

$ echo "`ls -l`"
person Colwin    schedule 10.05.2017

Чтобы дополнить эффективный ответ Колвина почему нужны двойные кавычки :

Если вы передаете без кавычек замену команды (например, `ls -l` или лучше, $(ls -l)) или ссылку на переменную (например, $var), оболочка изменяет вывод команды/значение переменной перед передача аргумента команде.
Это относится ко всем POSIX-совместимым оболочкам, а не только к bash.

В частности, следующие так называемые расширения оболочки выполненный:

  • разделение слов: вывод разделяется на (потенциально) несколько слов с помощью пробела, включая новые строки (по умолчанию; символы разделения можно установить через $IFS)

  • подстановка (расширение имени файла): каждое полученное слово интерпретируется как шаблон имени файла и сопоставляется с файлами в текущем каталоге, а каждое совпадающее имя файла становится отдельным словом, и все результирующие слова, заменяющие исходное слово; по умолчанию, если ничего не совпадает, слово остается как есть.

Затем полученные слова передаются как отдельные аргументы целевой команде.

Напротив, если вы заключаете в двойные кавычки подстановку команды ("$(ls -l)" или ссылку на переменную ("$var"), эти раскрытия НЕ выполняются, и выходные данные/значение передаются как есть. в целевую команду.


Поэтому в рассматриваемом случае:

  • оболочка удаляет все новые строки из вывода ls -l
  • а затем передает полученные слова отдельно в качестве нескольких аргументов в echo

echo просто объединяет несколько аргументов, которые вы ему передаете, с помощью пробелов, поэтому вы видите однострочный вывод, напечатанный в вашем вопросе.

Вкратце: из-за того, что `ls -l` не заключен в двойные кавычки, echo `ls -l` печатает разделенный пробелами однострочный список слов, содержащихся в выводе ls -l.

person mklement0    schedule 10.05.2017