Что такое магический разделитель между именами файлов в выводе ls?

20

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

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

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

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

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

$ ls
a.txt  b.txt  c.txt

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

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

Крис Б
источник

Ответы:

24

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

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

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

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

ls -1

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

Даниэль Андерссон
источник
7
В частности, функция lsиспользует, чтобы определить, является ли вывод терминалом isatty(3).
Blrfl
Также несколько связано, если кто-то хочет проверить это в простом сценарии оболочки, можно запустить tty -sи проверить его состояние возврата.
Даниэль Андерссон
10

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

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

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

ls -1
MilanorTSW
источник