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

时间:2014-05-24 20:14:28

标签: linux bash shell

好奇,这是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/

2 个答案:

答案 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;
    }