Bash 为什么ls在管道传输时提供不同的输出

Bash 为什么ls在管道传输时提供不同的输出,bash,Bash,直接打印到终端: $ ls a.out avg.c avg.h 管道至cat $ ls | cat a.out avg.c avg.h 为什么ls会根据目的地提供不同的输出?ls在管道传输时会自动执行类似于ls-1 这通常是您在将ls输送到awk或类似设备时所需要的,因为它将逐行处理ls的输出 要覆盖此默认行为,您可以使用ls-C | catls实际确定它是输出到终端还是文件(使用isatty库调用)。如果它检测到控制台,它将尝试使其更紧凑,以便更容易查看。因此每行仅为一个条目,从而允许

直接打印到终端:

$ ls
a.out  avg.c  avg.h
管道至
cat

$ ls | cat
a.out
avg.c
avg.h

为什么
ls
会根据目的地提供不同的输出?

ls
在管道传输时会自动执行类似于
ls-1

这通常是您在将
ls
输送到
awk
或类似设备时所需要的,因为它将逐行处理
ls
的输出


要覆盖此默认行为,您可以使用
ls-C | cat
ls
实际确定它是输出到终端还是文件(使用
isatty
库调用)。如果它检测到控制台,它将尝试使其更紧凑,以便更容易查看。

因此每行仅为一个条目,从而允许输出管道传输到的命令按预期工作。例如(给定
ls
输出),以下可能不是您想要的:

$ ls | sort -r
a.out  avg.c  avg.h
但是因为
sort
不知道每行有多个项目,所以它什么也做不了。将其与实际发生的情况进行比较:

$ ls | sort -r
avg.h
avg.c
a.out

您可以通过将<代码> -c>代码>传递到<代码> ls

fWW,从而实现这种(意想不到的)第一种行为,我认为这种行为被打破了。当所说的命令在发送到不同地方时改变输出时,能够轻松地将巨大的命令管道连接在一起的悠久传统变得更加困难。此外,它在管道中不使用颜色。因此,如果您想要彩色转义码,可以使用
ls-C--color=yes | cat
。它可以用于
ls-C--color=yes | less-R