ls在几列中返回输出,而对于我尝试过的目录ls|cat返回字节相同的输出ls -1。我仍然看到ls -1答案中的管道,例如ls -1|wc -l. 有没有更喜欢的理由ls -1?为什么会...|cat改变 的输出ls?
Joh*_*024 27
ls测试输出是否到达终端。如果输出不会到达终端,则-1是默认值。(这可以通过的一个被覆盖-C,-m或-x选项)。
因此,当ls在管道中使用并且您没有用另一个选项覆盖它时,ls将使用-1. 您可以依赖这一点,因为 POSIX 需要此行为
POSIX 需要-1作为默认输出,只要输出不去终端:
默认格式应为每行列出一个条目到标准输出;例外情况是终端或指定了 -C、-m 或 -x 选项之一。如果输出到终端,则格式是实现定义的。
覆盖默认单列格式的三个选项是:
-C
根据整理顺序,使用按列排序的条目编写多文本列输出。文本列数和列分隔符字符未指定,但应根据输出设备的性质进行调整。此选项禁用长格式输出。-m
流输出格式;列出整个页面的路径名,以 <comma> 字符后跟 <space> 字符分隔。使用 <newline> 字符作为列表终止符,当一行中没有空间用于下一个列表条目时,在分隔符序列之后使用。此选项禁用长格式输出。-x
与 -C 相同,不同之处在于多文本列输出是通过跨列而不是向下排序的条目生成的。此选项禁用长格式输出。
'-1'
'--format=single-column'
每行列出一个文件。当标准输出不是终端时,这是 ls 的默认值。另请参阅 -b 和 -q 选项以禁止直接输出文件名中的换行符。[强调]
让我们创建三个文件:
$ touch file{1..3}
Run Code Online (Sandbox Code Playgroud)
当输出到终端时,GNUls选择使用多列格式:
$ ls
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
当输出进入管道时,POSIX 规范要求单列是默认值:
$ ls | cat
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)
覆盖默认单列行为的三个例外是-m逗号分隔、-C向下-x排序的列和跨排序的列:
$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1 file2 file3
$ ls -x | cat
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
为什么管道标准输出会改变ls? 因为它是这样设计的。该POSIX规范说:
默认格式应为每行列出一个条目到标准输出;例外是,给终端时,或者当所述一个
-C,-m或者-x被指定的选项。如果输出到终端,则格式是实现定义的。
这实际上对输出到终端的默认行为(当未由类似-l或的选项指定时)模棱两可-1,并且GNU Coreutils 文档说
如果标准输出是终端,则输出为列(垂直排序),控制字符输出为问号;否则,每行列出一个输出,并按原样输出控制字符。
因此,您可以看到输出到文件的行为与输出到管道的行为相同;也就是说,每行一个条目,就好像-1已经指定了一样。
ls写入终端时,它期望有人正在查看输出。人们更愿意以最少的必要行数获取信息,因此内容不会滚动屏幕。ls写入管道时,它期望另一个程序正在读取输出。程序读取每行一个值的数据比尝试解析列要容易得多(因为文件名可以包含空格)。ls -1
当您写入文件或管道时,是否有理由更喜欢?不。