ls
проверяет, идет ли вывод в терминал. Если вывод не идет на терминал, то -1
по умолчанию. (Это может быть отменено одним из -C
, -m
или -x
опций.)
Таким образом, когда ls
используется в конвейере, и вы не переопределили его с другим параметром, ls
будет использоваться -1
. Вы можете положиться на это, потому что это поведение требуется POSIX
POSIX Технические характеристики
POSIX требует -1
по умолчанию, когда вывод не идет на терминал:
Спецификация POSIX :
Формат по умолчанию должен содержать одну запись в строке для стандартного вывода; исключения относятся к терминалам или когда указана одна из опций -C, -m или -x. Если вывод на терминал, формат определяется реализацией.
Эти три параметра, которые переопределяют формат по умолчанию с одним столбцом:
-C
Записать вывод многотекстового столбца с записями, отсортированными по столбцам в соответствии с порядком сортировки. Количество текстовых столбцов и символы разделителя столбцов не определены, но их следует адаптировать к характеру устройства вывода. Эта опция отключает вывод в длинном формате.
-m
формат вывода потока; перечислить имена путей по странице, разделенные символом <запятая>, за которым следует символ <пробел>. Используйте символ <newline> как терминатор списка и после последовательности разделителей, когда в строке нет места для следующей записи списка. Эта опция отключает вывод в длинном формате.
-x
То же, что и -C, за исключением того, что вывод многотекстовых столбцов производится с записями, отсортированными по столбцам, а не по столбцам. Эта опция отключает вывод в длинном формате.
Документация GNU
Из руководства GNU ls :
'-1'
'--format = single-column'
Вывести один файл на строку. Это значение по умолчанию для ls, когда стандартный вывод не является терминалом . Смотрите также параметры -b и -q для подавления прямого вывода символов новой строки в имени файла. [Акцент добавлен]
Примеры
Давайте создадим три файла:
$ touch file{1..3}
Когда вывод поступает на терминал, GNU ls
выбирает использовать многостолбцовый формат:
$ ls
file1 file2 file3
Когда вывод идет в конвейер, спецификация POSIX требует, чтобы по умолчанию был один столбец:
$ ls | cat
file1
file2
file3
Три исключения, которые переопределяют поведение одного столбца по умолчанию, относятся -m
к разделенным запятыми, -C
для отсортированных -x
по столбцам и для сортированных по столбцам:
$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1 file2 file3
$ ls -x | cat
file1 file2 file3
n=0; for i in .* *; do ((n++)) ; done ; echo $n
( опустите . *, если вы не хотите считать их). или:ls -1d ./.* ./* | grep '^\./' | wc -l
(поскольку имена файлов не могут содержать '/')