好奇,这是ls
的正常预期行为:
user@host:~$ ls
Codes Documents Music Pictures Templates
Desktop Downloads Papers Public Videos
但是当我使用管道/重定向ls
时,它的行为类似于ls -1
:
user@host:~$ ls | cat
Codes
Desktop
Documents
Downloads
Music
Papers
Pictures
Public
Templates
Videos
为什么呢? (以及如何编写这样的程序,在这样的stdout和pipe之间输出差异?)
P.S。我还设置了alias l='ls -F'
,这次管道/重定向不再是ls -1
样式:
user@host:~$ l | cat
Codes/ Documents/ Music/ Pictures/ Templates/
Desktop/ Downloads/ Papers/ Public/ Videos/
不使用别名,它以ls -1
样式执行命令,但是:
$ ls -F | cat
Codes/
Desktop/
Documents/
Downloads/
Music/
Papers/
Pictures/
Public/
Templates/
Videos/
答案 0 :(得分:6)
您可以在source:
中查看此行if (format == long_format)
format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
它使用isatty函数检查stdout
是否指向tty,如果是{I}则打印many_per_line
,如果不是则one_per_line
。
答案 1 :(得分:2)
以下是GNU ls
如何做到(ls.c):
if (isatty (STDOUT_FILENO))
{
format = many_per_line;
}
else
{
format = one_per_line;
}