为什么`ls | cat`不等于`ls`?

9
为什么这两个命令的输出不同:

python -c 'print("hello")'

print("hello")

ls | cat

ls

第一种方法似乎是通过换行符来分隔文件名的。
这也适用于像 ls > outfile 这样的命令,以及类似的操作。
我使用的是Mac OSX系统,如果有区别的话。
1个回答

12

ls命令检查其标准输出的文件类型。如果它检测到了“tty”,它会发出多列输出。如果它检测到其他任何文件类型(如磁盘文件或管道),它就会发出单列输出。

Tty是 teletype 的缩写。在旧时代,您需要使用实际的 teletype 与 Unix 系统进行交互。因此,如果标准输出是 teletype,则 ls 将生成针对人类优化的输出。否则,它将生成针对程序优化的输出。

随着其他交互式 shell 运行方式的出现,例如 telnet 会话和窗口系统,Unix 作者创建了伪 teletype 或“pty”,这是一个仅用于软件的“设备”,假装自己是一个 teletype。一个程序(例如 telnet 服务器、ssh 服务器或终端窗口)可以使用 pty 来让另一个程序(shell)认为它正在与 teletype 交谈。

您可以使用 -C 标志来强制 ls 发出多列输出。您可以使用 -1(数字一)标志来强制单列输出。


1
+1,但我认为你的意思是-1,而不是-x,它会强制输出单列;-x仍然会产生多列输出,但“条目跨列排序,而不是向下排序”。- http://man.cx/ls - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接