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