ls输出中文件名之间的魔术分隔符是什么?


20

ls(不带参数)的输出似乎以换行符分隔文件名。

证据:

  • ls | grep foo按预期工作,grep将每个文件名视为单独的输入行。

  • ls > files.txt; vim files.txt ->在Vim中,每个文件在单独的行中

但在终端中,输出的结果ls将多个文件放在一行上,用空格分隔文件名以使各列对齐良好:

$ ls
a.txt  b.txt  c.txt

所以我的问题是,ls怎么做到的?

是否使用一些特殊的控制字符来“伪造”换行符?还是知道何时将其输出传递到另一个命令,并在这种情况下以不同的格式设置其输出?

Answers:


24

还是知道何时将其输出传递到另一个命令,并在这种情况下以不同的格式设置其输出?

是。从完整手册中获取(info ls如果安装了文档,则可以找到):

如果标准输出是终端,则输出为列(垂直排列),并且控制字符作为问号输出;否则,输出每行列出一个,并且控制字符按原样输出。

如果您喜欢一列输出,则可以运行

ls -1

也可以在终端上获取它


7
具体来说,该函数ls用于确定输出是否为终端is isatty(3)
Blrfl 2012年

同样有些相关,如果要在简单的shell脚本中进行测试,可以运行tty -s并检查其返回状态。
丹尼尔·安德森

10

ls通过管道输出时检测到它。您可以在文档中看到它:

如果标准输出是终端,则输出为列(垂直排列),并且控制字符作为问号输出;否则,输出每行列出一个,并且控制字符按原样输出。

如果希望将输出中的每个文件放在单独的行上,而不管管道重定向如何,都可以使用

ls -1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.