Đầu ra từ ls có dòng mới nhưng hiển thị trên một dòng. Tại sao?


41

Tôi nghĩ rằng tôi có thể đang xem xét một điểm tương đối cơ bản liên quan đến vỏ. Đầu ra từ lệnh ls theo mặc định tách đầu ra với dòng mới, nhưng shell hiển thị đầu ra trên một dòng.

bất cứ ai có thể giải thích điều này với tôi? Tôi đã luôn cho rằng đầu ra được phân tách đơn giản bằng khoảng trắng, nhưng bây giờ tôi thấy đầu ra được phân tách bằng các dòng mới, tôi sẽ mong đợi đầu ra sẽ được hiển thị trên các dòng riêng biệt.

Thí dụ:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

od cho thấy rằng đầu ra được phân tách bằng dòng mới:

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

Nếu có dòng mới, thì tại sao đầu ra không hiển thị dưới dạng:

text1 
text2
text3

Câu trả lời:


44

Khi bạn dẫn đầu ra, lshành động khác nhau.

Thực tế này được ẩn đi trong tài liệu thông tin :

Nếu đầu ra tiêu chuẩn là một thiết bị đầu cuối, đầu ra nằm trong các cột (được sắp xếp theo chiều dọc) và các ký tự điều khiển là đầu ra dưới dạng dấu hỏi; mặt khác, đầu ra được liệt kê một trên mỗi dòng và các ký tự điều khiển là đầu ra nguyên trạng.

Để chứng minh, hãy thử chạy

ls

và sau đó

ls | less

Điều này có nghĩa là nếu bạn muốn đầu ra được đảm bảo là một tệp trên mỗi dòng, bất kể nó đang được chuyển hướng hay chuyển hướng, bạn phải chạy

ls -1

( -1là số một)

Hoặc, bạn có thể buộc ls | lessxuất ra các cột bằng cách chạy

ls -C

( -Clà thủ đô C)


6
@theconnorpower: nó khá cụ thể ls. Nó rất hữu ích, nhưng rõ ràng không nhất quán và đáng ngạc nhiên. Nhưng lưu ý rằng một số lệnh tạo đầu ra màu sẽ loại bỏ màu khi bị quá.
Mikel

5
@theconnorpower: Trivia: Các nhà phát minh của Unix đã tiếp tục viết Plan9. Trong Plan9, lsluôn in một dòng trên mỗi dòng và lcluôn in trong các cột.
Mikel

2
@theconnorpower: Cũng có các chương trình đọc kích thước của thiết bị đầu cuối và điều chỉnh đầu ra của chúng cho phù hợp, ví dụ trên Debian dpkg -lsẽ sử dụng toàn bộ chiều rộng của màn hình, nhưng nếu in ra một ống, nó giả sử thiết bị đầu cuối rộng 80 cột và viết tắt đầu ra để làm cho nó phù hợp nếu cần thiết.
Mikel

1
@Mikel Thật thú vị khi nghe sự khác biệt của ls / lc trong Plan9. Cảm ơn các câu trả lời chi tiết.
zod90

1
Làm thế nào một chương trình có thể xác định nếu đầu ra của nó được chuyển hướng đến một tập tin hoặc liệu nó sẽ đến một vỏ?
dùng2820379

4

Khám phá của bạn nêu bật lý do chính tại sao phân tích cú pháp đầu ra lsluôn là một ý tưởng tồi. Xem wiki của Greg để được giải thích đầy đủ .

Hãy nghĩ về vấn đề của bạn ngược lại. Bạn nhận thấy rằng đôi khi tôi làm và đôi khi không in dòng mới giữa đầu ra của nó. Để sử dụng trong các tập lệnh hoặc khi bị buộc bởi -1cờ, nó không. Một dòng mới ở cuối mỗi tập tin. Điều không có gì đảm bảo rằng mỗi dòng mới đại diện cho một tên tệp mới . Trong thực tế, nếu một tên tệp chứa chính một dòng mới, đầu ra của ls sẽ hoàn toàn không thể phân tích cú pháp. Hãy xem xét các tên tệp này:

file1
file2\nfile3
file4

Khi bạn có ls -1một thư mục chứa trong đó, bạn sẽ nhận được một cái gì đó trông như thế này:

file1
file2
file3
file4

Bạn có tự nhiên không có bốn tập tin? Vì vậy, bất kỳ kịch bản phân tích đầu ra của ls. Trong thực tế, có ba tệp, một trong số đó có tên khó hiểu, nhưng bạn sẽ không thể tìm ra điều đó từ đầu ra của ls. *

* Trừ khi bạn đang sử dụng -lcờ và nhận thấy đầu ra bị hỏng, nhưng tập lệnh của bạn vẫn bị nghẹt.


3
Nếu bạn thực sự phải phân tích cú pháp đầu ra ls, -btùy chọn có thể giúp ích. Nó biến dòng mới thành \n, v.v.
Mikel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.