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

时间:2011-12-21 02:15:22

标签: bash

直接打印到终端:

$ ls
a.out  avg.c  avg.h

管道到cat

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

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

3 个答案:

答案 0 :(得分:6)

使用管道时,

ls会自动表现为ls -1

这通常是您将ls传递给awk之类的东西,或类似的东西,因为它会逐行处理ls的输出。

要覆盖此默认行为,您可以使用ls -C | cat

答案 1 :(得分:6)

ls实际上可以确定它是输出到终端还是文件(使用isatty库调用)。如果它检测到控制台,它会尝试使其更紧凑,以便于查看。

答案 2 :(得分:1)

因此,每行只是一个条目,允许输出通过管道输出的命令工作,这可能是预期的。例如(给定ls输出),以下可能不是您想要的:

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

但是因为sort不知道每行有多个项目,所以它无能为力。将其与实际情况进行比较:

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

您可以将-C传递给ls来实现(意外)第一个行为。