20 ls(不带参数)的输出似乎以换行符分隔文件名。 证据: ls | grep foo按预期工作,grep将每个文件名视为单独的输入行。 ls > files.txt; vim files.txt ->在Vim中,每个文件在单独的行中 但在终端中,输出的结果ls将多个文件放在一行上,用空格分隔文件名以使各列对齐良好: $ ls a.txt b.txt c.txt 所以我的问题是,ls怎么做到的? 是否使用一些特殊的控制字符来“伪造”换行符?还是知道何时将其输出传递到另一个命令,并在这种情况下以不同的格式设置其输出? ls pipe newlines — 克里斯·B source
24 还是知道何时将其输出传递到另一个命令,并在这种情况下以不同的格式设置其输出? 是。从完整手册中获取(info ls如果安装了文档,则可以找到): 如果标准输出是终端,则输出为列(垂直排列),并且控制字符作为问号输出;否则,输出每行列出一个,并且控制字符按原样输出。 如果您喜欢一列输出,则可以运行 ls -1 也可以在终端上获取它 — 丹尼尔·安德森 source 7 具体来说,该函数ls用于确定输出是否为终端is isatty(3)。 — Blrfl 2012年 同样有些相关,如果要在简单的shell脚本中进行测试,可以运行tty -s并检查其返回状态。 — 丹尼尔·安德森
10 ls通过管道输出时检测到它。您可以在文档中看到它: 如果标准输出是终端,则输出为列(垂直排列),并且控制字符作为问号输出;否则,输出每行列出一个,并且控制字符按原样输出。 如果希望将输出中的每个文件放在单独的行上,而不管管道重定向如何,都可以使用 ls -1 — 米兰TSW source
ls
用于确定输出是否为终端isisatty(3)
。