只是好奇,这是正常预期的行为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)
您可以从源中检查此行:
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
不打印.