2011-12-21 34 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實現(意外)第一行爲。

相關問題