Чтобы дополнить эффективный ответ Колвина почему нужны двойные кавычки :
Если вы передаете без кавычек замену команды (например, `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