Вывод ls
(без аргументов), кажется, разделяет имена файлов с переносами строк.
Доказательства:
ls | grep foo
работает как положено,grep
обрабатывая каждое имя файла как отдельную строку ввода.ls > files.txt; vim files.txt
-> в Vim каждый файл находится на отдельной строке
И все же в терминале вывод команды ls
помещает несколько файлов в одну строку, разделяя имена файлов пробелами, чтобы сделать хорошо выровненные столбцы:
$ ls
a.txt b.txt c.txt
Итак, мой вопрос: как мне это сделать?
Использует ли он какой-то специальный контрольный символ для «подделки» новой строки? Или он знает, когда его вывод передается другой команде, и в этом случае форматирует вывод иначе?
ls
использует, чтобы определить, является ли вывод терминаломisatty(3)
.tty -s
и проверить его состояние возврата.ls
обнаруживает, когда вы передаете его вывод. Вы можете увидеть это в документации:Если вы хотите, чтобы каждый файл в выходных данных размещался на отдельной строке независимо от перенаправления канала, вы можете использовать
источник