Почему echo `ls -l` не имеет перевода строки?

Почему echo `ls -l` не имеет перевода строки?

Я использую WSL (подсистема Windows для Linux) и когда я использую функцию ls -lна терминале, я получаю новые строки, то есть каждый файл находится на новой строке, например:

total 12K
drwxrwxrwx 1 user user 4.0K Apr  4 23:28 .
drwxr-xr-x 1 user user 4.0K Apr  4 23:28 ..
-rw-rw-rw- 1 user user    0 Mar 28 01:03 a1.file
-rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml
-rw-rw-rw- 1 user user    0 Mar 13 00:19 file1
-rw-rw-rw- 1 user user  513 Mar 13 00:19 file2.txt
-rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt
-rw-rw-rw- 1 user user  405 Apr  4 23:26 ls_l.txt
-rw-rw-rw- 1 user user    0 Apr  4 23:28 ls_l2.txt
-rw-rw-rw- 1 user user   89 Mar 13 00:18 pattern
-rw-rw-rw- 1 user user   86 Mar 28 01:41 somefile.file

Однако когда я использую echo `ls -l` > file1.txt, он имеет то же самое, что и ls -lобычно, но все в одной строке, где каждая строка отделена пробелами, а не новыми строками, например:

total 12K drwxrwxrwx 1 user user 4.0K Mar 27 22:45 . drwxr-xr-x 1 user user 4.0K Mar 27 22:45 .. -rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml -rw-rw-rw- 1 user user 0 Mar 13 00:19 file1 -rw-rw-rw- 1 user user 513 Mar 13 00:19 file2.txt -rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt -rw-rw-rw- 1 user user 403 Mar 27 22:45 ls_l.txt -rw-rw-rw- 1 user user 89 Mar 13 00:18 pattern

Обратите внимание, что у меня есть следующие соответствующие псевдонимы:

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls -lah'

решение1

Цитата!!

Когда вы выполняете ls -l, да, он генерирует новые строки (как вы сообщаете). echo `ls -l` ,Однако когда вы это делаете, никаких новых строк не видно. Попробуйте.

Причина в том, что `...`конструкция является расширением команды, а большинство расширений (есть и другие) подвержены разделению оболочки (если не заключены в кавычки). Разделение оболочки удаляет все символы в переменной IFS, которая по умолчанию содержит <space><tab><newline>. Все переводы строк из ls -lудаляются, и строка разделяется в этой точке. Последний echoприсоединяется к каждой разделенной части, разделяя их одним пробелом.

Итак, да, и старый, и правильный и предпочтительный в любое время новый:

echo `ls -l`
echo $(ls -l)

Если по умолчанию используется IFS, то файлы в текущем каталоге будут перечислены в одной строке без новых строк.

Перенаправление этой строки в файл приведет к записи одной строки в этот файл, как и следовало ожидать.

echo $(ls -l) > file

Чтобы сохранить переносы строк, заключите расширение в кавычки:

echo "$(ls -l)"

Или, пожалуйста, избегайте использования устаревших `...`:

echo "`ls -l`"

А чтобы получить вывод в файле, просто перенаправьте его в файл:

echo "$(ls -l)" > file

Связанный контент