ls
测试输出是否将发送到终端。如果输出不发送到终端,-1
则为默认值。(这可以通过的一个被覆盖-C
,-m
或-x
选项)。
因此,当ls
在管道中使用时,并且尚未用其他选项覆盖它时,ls
将使用-1
。 您可以依靠它,因为POSIX要求此行为
POSIX规格
-1
每当输出不发送到终端时,POSIX都将其作为默认值:
POSIX规范:
默认格式是在标准输出中每行列出一个条目。终端或指定了-C,-m或-x选项之一的情况除外。如果输出到终端,则格式是实现定义的。
这三个覆盖默认单列格式的选项是:
-C
根据排序顺序,写出多文本列输出,并按列对条目进行排序。文本列的数量和列分隔符未指定,但应根据输出设备的性质进行调整。此选项禁用长格式输出。
-m
流输出格式;列出页面中的路径名,用<逗号>字符和<space>字符分隔。当下一行列表中没有足够的空间时,请使用<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
文件名不能包含“ /”)