rubystallion Asked: 2017-12-13 22:43:56 +0800 CST2017-12-13 22:43:56 +0800 CST 2017-12-13 22:43:56 +0800 CST 管道 ls 是否与 ls -1 相同? 772 ls在几列中返回输出,而返回与我尝试过的目录ls|cat相同的字节输出。ls -1我仍然看到ls -1答案,比如ls -1|wc -l. 有没有理由喜欢ls -1?为什么要...|cat改变输出ls? shell ls 3 个回答 Voted Best Answer John1024 2017-12-13T22:58:17+08:002017-12-13T22:58:17+08:00 ls测试输出是否到终端。如果输出不去终端,那么-1是默认值。(这可以被 、 或 选项之一-C覆盖-m。-x) 因此,当ls在管道中使用并且您没有用另一个选项覆盖它时,ls将使用-1. 您可以依赖它,因为 POSIX 需要这种行为 POSIX 规范 -1每当输出不进入终端时,POSIX 要求作为默认值: POSIX 规范: 默认格式应为每行列出一个条目到标准输出;例外情况是终端或指定了 -C、-m 或 -x 选项之一时。如果输出到终端,则格式是实现定义的。 覆盖默认单列格式的这三个选项是: -C根据整理顺序,使用按列排序的条目写入多文本列输出。文本列数和列分隔符未指定,但应适应输出设备的性质。此选项禁用长格式输出。 -m流输出格式;列出整个页面的路径名,由 <comma> 字符后跟 <space> 字符分隔。使用 <newline> 字符作为列表终止符并在分隔符序列之后,当行上没有空间用于下一个列表条目时。此选项禁用长格式输出。 -x与 -C 相同,不同之处在于生成多文本列输出时条目按列排序,而不是向下排序。此选项禁用长格式输出。 GNU 文档 来自GNU ls 手册: '-1' '--format=single-column'每行列出一个文件。当标准输出不是终端时,这是 ls 的默认值。另请参见 -b 和 -q 选项以禁止在文件名中直接输出换行符。[强调补充] 例子 让我们创建三个文件: $ touch file{1..3} 当输出到终端时,GNUls选择使用多列格式: $ 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 G-Man Says 'Reinstate Monica' 2017-12-13T23:13:46+08:002017-12-13T23:13:46+08:00 为什么管道标准输出会改变 的行为ls?因为它是这样设计的。POSIX 规范说: 默认格式应为每行列出一个条目到标准输出;例外情况是终端或指定-C、-m或-x选项之一时。如果输出到终端,则格式是实现定义的。 这实际上对于输出到终端的默认行为(当没有由类似-lor之类的选项指定时)是模棱两可的,并且GNU Coreutils 文档说-1 如果标准输出是终端,则输出按列(垂直排序),控制字符作为问号输出;否则,输出每行列出一个,控制字符按原样输出。 所以你可以看到输出到文件的行为与输出到管道的行为相同;也就是说,每行一个条目,就好像-1已经指定了一样。 为什么要这样设计?可能无法确定(除非有人能找到一些设计说明),但我猜: 当ls写入终端时,它期望人类正在查看输出。人们更愿意以最少的必要行数获取信息,因此内容不会滚动屏幕。 当ls写入管道时,它期望另一个程序正在读取输出。程序读取每行一个值的数据比必须尝试解析列要容易得多(因为文件名可以包含空格)。 ls -1 当您写入文件或管道时,有没有理由更喜欢?不。 caylee 2017-12-13T22:53:23+08:002017-12-13T22:53:23+08:00 当管道 ls 时,ls 无法确定控制台实际有多少列(独立于右侧命令)。所以 ls 只是根据自己的选择这样做,或者换句话说,这种行为是不稳定的,并且可能在未来的版本中发生变化。 相比之下,ls -1一般是为了计数或脚本而创建的,因此它的行为是稳定的。
ls
测试输出是否到终端。如果输出不去终端,那么-1
是默认值。(这可以被 、 或 选项之一-C
覆盖-m
。-x
)因此,当
ls
在管道中使用并且您没有用另一个选项覆盖它时,ls
将使用-1
. 您可以依赖它,因为 POSIX 需要这种行为POSIX 规范
-1
每当输出不进入终端时,POSIX 要求作为默认值:POSIX 规范:
覆盖默认单列格式的这三个选项是:
GNU 文档
来自GNU ls 手册:
例子
让我们创建三个文件:
当输出到终端时,GNU
ls
选择使用多列格式:当输出进入管道时,POSIX 规范要求单列是默认值:
覆盖默认单列行为的三个例外是
-m
用于逗号分隔-C
的列、向下排序的列以及-x
跨列排序的列:为什么管道标准输出会改变 的行为
ls
?因为它是这样设计的。POSIX 规范说:这实际上对于输出到终端的默认行为(当没有由类似
-l
or之类的选项指定时)是模棱两可的,并且GNU Coreutils 文档说-1
所以你可以看到输出到文件的行为与输出到管道的行为相同;也就是说,每行一个条目,就好像
-1
已经指定了一样。ls
写入终端时,它期望人类正在查看输出。人们更愿意以最少的必要行数获取信息,因此内容不会滚动屏幕。ls
写入管道时,它期望另一个程序正在读取输出。程序读取每行一个值的数据比必须尝试解析列要容易得多(因为文件名可以包含空格)。ls -1
当您写入文件或管道时,有没有理由更喜欢?不。当管道 ls 时,ls 无法确定控制台实际有多少列(独立于右侧命令)。所以 ls 只是根据自己的选择这样做,或者换句话说,这种行为是不稳定的,并且可能在未来的版本中发生变化。
相比之下,
ls -1
一般是为了计数或脚本而创建的,因此它的行为是稳定的。