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

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

ls(没有参数)的输出似乎用换行符分隔文件名。

证据:

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

  • ls > files.txt; vim files.txt--> 在 Vim 中,每个文件都占一行

然而在终端中,输出ls将多个文件放在一行上,用空格分隔文件名以使列对齐:

$ ls
a.txt  b.txt  c.txt

所以我的问题是,ls 是如何做到这一点的?

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

答案1

或者它是否知道何时其输出被传送到另一个命令,并且在这种情况下以不同的方式格式化其输出?

是的。完整手册(info ls如果安装了文档则可通过以下方式获取):

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

如果你喜欢单列输出,你可以运行

ls -1

在终端中也可以得到它。

答案2

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

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

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

ls -1

相关内容