2011-12-21 26 views
8

In ấn đến thiết bị đầu cuối trực tiếp:Tại sao ls cho đầu ra khác nhau khi đường ống

$ ls 
a.out avg.c avg.h 

Piping để cat

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

Tại sao ls cho một đầu ra khác nhau dựa trên đích?

+0

FWIW, tôi cho rằng hành vi này bị hỏng. Truyền thống thời gian được vinh danh là dễ dàng có thể xâu chuỗi các đường ống rất lớn của lệnh được thực hiện khó khăn hơn nhiều khi các lệnh nói thay đổi ouput của chúng khi nó được gửi đến những nơi khác nhau. – paxdiablo

Trả lời

6

ls thực sự có thể xác định xem nó xuất ra thiết bị đầu cuối hay tệp (với cuộc gọi thư viện isatty). Nếu nó phát hiện một bàn điều khiển, nó sẽ cố gắng làm cho nó nhỏ gọn hơn để xem dễ dàng hơn.

+0

tìm một trang web: http://www.ginac.de/~kreckel/fileno – kev

6

ls tự động hoạt động như ls -1 khi được bơm.

Đây thường là những gì bạn muốn khi bạn đang piping ls đến awk hoặc một cái gì đó tương tự, vì nó sẽ xử lý đầu ra của ls trên cơ sở từng dòng.

Để ghi đè hành vi mặc định này, bạn có thể sử dụng ls -C | cat.

+0

Ngoài ra, nó ls không sử dụng màu sắc khi đường ống. Vì vậy, nếu bạn muốn các mã thoát đầy màu sắc, bạn có thể sử dụng 'ls -C --color = yes | cat'. Nó có thể hữu ích với 'ls -C --color = yes | ít hơn -R' –

1

Vì vậy, mỗi dòng chỉ là một mục nhập, cho phép lệnh đầu ra được chuyển sang hoạt động như mong đợi. Ví dụ (cho ls đầu ra của bạn), sau đây có lẽ không phải là những gì bạn muốn:

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

Nhưng vì sort không biết là có nhiều hơn một mục trên mỗi dòng, nó không thể làm bất cứ điều gì. Hãy so sánh này với những gì thực sự xảy ra:

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

Bạn có thể đạt được (bất ngờ) hành vi đầu tiên bằng cách thông qua -C-ls.

Các vấn đề liên quan