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

标签 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

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


附言我还设置了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/

最佳答案

您可以从 source 查看此行:

if (format == long_format)
  format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);

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

关于linux - 为什么 `ls` 每行列出多个文件,而 `ls pipe/redirect` 每行只列出 1 个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23849229/

相关文章:

linux - 是否有我可以在内核中使用的函数列表?

bash - 如何使用 bash 脚本拆分包含多条记录的行

linux - 远程 SSH 和命令集以及变量替换

linux - EOF 内的 bash 脚本无法将参数传递给函数

ios - 通过终端批量构建和归档 iOS 应用程序

.net - 在 Linux 中使用 Mono.NET 库

c - 理解这些过程如何运作的问题

linux - 如何修复 500 OOPS : vsf_sysutil_recv_peek error in EC2 instance?

linux - 在启动树莓派时运行两个程序

linux - 找不到 bash 脚本命令