ls
возвращает вывод в нескольких столбцах, тогда как ls|cat
возвращает идентичный байту вывод ls -1
для каталогов, которые я пробовал. Тем не менее я вижу, что ls -1
в ответах, как ls -1|wc -l
. Есть ли причина отдавать предпочтение ls -1
? Почему ...|cat
меняется выход ls
?
19
n=0; for i in .* *; do ((n++)) ; done ; echo $n
( опустите . *, если вы не хотите считать их). или:ls -1d ./.* ./* | grep '^\./' | wc -l
(поскольку имена файлов не могут содержать '/')ls
вывод на терминал обычно включает цветовые коды по умолчанию. Для вывода на нетерминал цвет обычно отключен по умолчанию. В GNU это--color={always,auto,never}
IIRC. Если цвет включен в один, а не в другой, то выходные данные могут отображаться на экране одинаковыми, но они не являются байтовыми (цветовые коды являются частью выходных данных ls).Ответы:
ls
проверяет, идет ли вывод в терминал. Если вывод не идет на терминал, то-1
по умолчанию. (Это может быть отменено одним из-C
,-m
или-x
опций.)Таким образом, когда
ls
используется в конвейере, и вы не переопределили его с другим параметром,ls
будет использоваться-1
. Вы можете положиться на это, потому что это поведение требуется POSIXPOSIX Технические характеристики
POSIX требует
-1
по умолчанию, когда вывод не идет на терминал:Спецификация POSIX :
Эти три параметра, которые переопределяют формат по умолчанию с одним столбцом:
Документация GNU
Из руководства GNU ls :
Примеры
Давайте создадим три файла:
Когда вывод поступает на терминал, GNU
ls
выбирает использовать многостолбцовый формат:Когда вывод идет в конвейер, спецификация POSIX требует, чтобы по умолчанию был один столбец:
Три исключения, которые переопределяют поведение одного столбца по умолчанию, относятся
-m
к разделенным запятыми,-C
для отсортированных-x
по столбцам и для сортированных по столбцам:источник
-1
в качестве значения по умолчанию, за исключением случаев, когда вывод поступает на терминал (или другие условия)Почему использование стандартного вывода изменяет поведение
ls
? Потому что так было задумано. Спецификация POSIX говорит:что на самом деле неоднозначно по отношению к поведению по умолчанию (если оно не указано опцией вроде
-l
или-1
) с выводом на терминал, а в документации GNU Coreutils говоритсяТаким образом, вы можете видеть, что вывод в файл будет действовать так же, как вывод в канал; то есть одна запись в строке, как если бы
-1
она была указана.ls
пишет в терминал, он ожидает, что человек смотрит на результат. Люди предпочитают получать информацию в минимально необходимом количестве строк, поэтому материал не прокручивается на экране.ls
пишет в канал, он ожидает, что другая программа читает вывод. Для программы намного проще читать данные, которые имеют одно значение на строку, чем пытаться анализировать столбцы (поскольку имена файлов могут содержать пробелы).ls -1
когда вы пишете в файл или канал? Нет .источник
При использовании ls, ls не может определить, сколько столбцов на самом деле имеет консоль (независимо от команды правой стороны). Поэтому я просто делаю это по своему выбору, или, другими словами, это поведение нестабильно и может измениться в будущих версиях.
Напротив,
ls -1
был создан с целью подсчета или сценариев в целом, поэтому его поведение является стабильным.источник