18

Вывод ls (без аргументов), кажется, разделяет имена файлов с переносами строк.

Доказательства:

  • ls | grep foo работает как положено, при этом grep рассматривает каждое имя файла как отдельную строку ввода.

  • ls > files.txt; vim files.txt -> в Vim каждый файл находится на отдельной строке

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

$ ls
a.txt  b.txt  c.txt

Итак, мой вопрос: как мне это сделать?

Использует ли он какой-то специальный контрольный символ для «подделки» новой строки? Или он знает, когда его вывод передается другой команде, и в этом случае форматирует вывод иначе?

2 ответа2

23

Или он знает, когда его вывод передается другой команде, и в этом случае форматирует вывод иначе?

Да. Из полного руководства (доступно через info ls если документация установлена):

Если стандартным выводом является терминал, вывод выводится в столбцах (отсортированных по вертикали), а управляющие символы выводятся в виде вопросительных знаков; в противном случае вывод выводится по одному на строку, а управляющие символы выводятся как есть.

Если вам нравится вывод в один столбец, вы можете запустить

ls -1

чтобы получить его в терминале.

10

ls обнаруживает это, когда вы передаете вывод. Вы можете увидеть это в документации:

Если стандартным выводом является терминал, вывод выводится в столбцах (отсортированных по вертикали), а управляющие символы выводятся в виде вопросительных знаков; в противном случае вывод выводится по одному на строку, а управляющие символы выводятся как есть.

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

ls -1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .