为什么`ls`每行列出多个文件,但`ls pipe/redirect`列出每行只有1个文件?

nei*_*zod 6 linux bash shell

只是好奇,这是正常预期的行为ls:

user@host:~$ ls
Codes    Documents  Music   Pictures  Templates
Desktop  Downloads  Papers  Public    Videos
Run Code Online (Sandbox Code Playgroud)

但是当我使用ls管道/重定向时,它表现得像ls -1:

user@host:~$ ls | cat
Codes
Desktop
Documents
Downloads
Music
Papers
Pictures
Public
Templates
Videos
Run Code Online (Sandbox Code Playgroud)

为什么?(以及如何编写这样的程序,在这样的stdout和管道之间提供差异输出?)


PS我也设置了alias l='ls -F',这次管道/重定向不再是ls -1样式:

user@host:~$ l | cat
Codes/    Documents/  Music/   Pictures/  Templates/
Desktop/  Downloads/  Papers/  Public/    Videos/
Run Code Online (Sandbox Code Playgroud)

不使用别名,它以ls -1样式执行命令,但是:

$ ls -F | cat
Codes/
Desktop/
Documents/
Downloads/
Music/
Papers/
Pictures/
Public/
Templates/
Videos/
Run Code Online (Sandbox Code Playgroud)

Pio*_*zmo 6

您可以从源中检查此行:

if (format == long_format)
  format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
Run Code Online (Sandbox Code Playgroud)

它使用isatty函数来检查是否stdout指向tty,many_per_line如果是,则打印或one_per_line不打印.