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

前端之家收集整理的这篇文章主要介绍了linux – 为什么`ls`每行列出多个文件,但`ls pipe / redirect`列出每行只有1个文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
只是好奇,这是ls的正常预期行为:
  1. user@host:~$ls
  2. Codes Documents Music Pictures Templates
  3. Desktop Downloads Papers Public Videos

但是当我使用带管道/重定向的ls时,它的行为类似于ls -1:

  1. user@host:~$ls | cat
  2. Codes
  3. Desktop
  4. Documents
  5. Downloads
  6. Music
  7. Papers
  8. Pictures
  9. Public
  10. Templates
  11. Videos

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

附:我还设置别名l =’ls -F’,这次管道/重定向不再是ls -1样式:

  1. user@host:~$l | cat
  2. Codes/ Documents/ Music/ Pictures/ Templates/
  3. Desktop/ Downloads/ Papers/ Public/ Videos/

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

  1. $ls -F | cat
  2. Codes/
  3. Desktop/
  4. Documents/
  5. Downloads/
  6. Music/
  7. Papers/
  8. Pictures/
  9. Public/
  10. Templates/
  11. Videos/

解决方法

你可以从 source检查这一行:
  1. if (format == long_format)
  2. format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);

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

猜你在找的Linux相关文章