2011-12-21 69 views
8

打印到终端:为什么LS得到不同的输出,当直接用管道输送

$ ls 
a.out avg.c avg.h 

管道到cat

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

为什么ls给基于目的地不同的输出?

+0

FWIW,我认为这种行为被打破。当所述命令被发送到不同的地方时,当所述命令改变其输出时,能够容易地将巨大的命令流水线串起在一起的历史悠久的传统变得更加困难。 – paxdiablo 2011-12-21 02:40:06

回答

6

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

+0

找到一个网页:http://www.ginac.de/~kreckel/fileno – kev 2011-12-21 03:14:45

6

ls自动行为像管道时的ls -1

这通常是你在管道lsawk或类似的东西时想要的,因为它将逐行处理ls的输出。

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

+0

另外,它在输送时不会使用颜色。所以如果你想要多彩的转义代码,你可以使用'ls -C --color = yes | cat'。它可以用于'ls -C --color = yes |减-R' – 2011-12-21 03:12:53

1

因此,每一行只有一个条目,允许命令输出管道工作,因为可能会预期。例如(鉴于你ls输出),下面很可能不是你想要的东西:

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

但由于sort不知道有每行一个以上的项目,它不能做任何事情。与此相比,究竟发生:

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

你可以通过-Cls实现(意外)第一行为。

相关问题