là ls đường ống giống như ls -1?


19

lstrả về đầu ra trong một số cột, trong khi ls|cattrả về đầu ra giống hệt byte với ls -1các thư mục tôi đã thử. Vẫn tôi thấy ls -1đường ống trong câu trả lời, như ls -1|wc -l. Có bao giờ một lý do để thích ls -1? Tại sao ...|catthay đổi đầu ra của ls?


1
tên tệp có thể chứa dòng mới, vì vậy bạn sẽ đếm số lần đó ... thay vào đó bạn có thể thực hiện một cách ngẫu nhiên: n=0; for i in .* *; do ((n++)) ; done ; echo $n(bỏ. * nếu bạn không muốn đếm số đó). hoặc: ls -1d ./.* ./* | grep '^\./' | wc -l (vì tên tệp không thể chứa '/')
Olivier Dulac

3
lsđầu ra cho một thiết bị đầu cuối thường bao gồm các mã màu theo mặc định. Đối với đầu ra cho một thiết bị đầu cuối, màu thường được tắt theo mặc định. Trong GNU, đó là --color={always,auto,never}IIRC. Nếu màu được bao gồm trong một nhưng không phải màu khác, thì các đầu ra có thể xuất hiện giống hệt nhau trên màn hình, nhưng chúng không giống nhau (mã màu là một phần của đầu ra của ls).
một CVn

@ MichaelKjorling Tôi nghĩ bạn nên viết nó như một câu trả lời.
200_success

@ MichaelKjorling Đó là điều thú vị tôi chưa từng xem xét. Có một cách chung để luôn luôn đường ống như thể xuất ra thiết bị đầu cuối mà không cần phải nhớ các tùy chọn thiết bị đầu cuối cho màu sắc và đầu ra cột, v.v.?
rubystallion

@rubystallion Nghe có vẻ như là một câu hỏi riêng biệt.
một CVn

Câu trả lời:


26

lskiểm tra xem đầu ra có đi đến một thiết bị đầu cuối không. Nếu đầu ra không đi đến một thiết bị đầu cuối, thì đó -1là mặc định. (Điều này có thể được vô hiệu hóa bởi một trong những -C, -mhoặc -xtùy chọn.)

Do đó, khi lsđược sử dụng trong một đường ống dẫn và bạn chưa ghi đè nó bằng một tùy chọn khác, lssẽ sử dụng -1. Bạn có thể dựa vào điều này vì hành vi này được POSIX yêu cầu

Đặc điểm kỹ thuật POSIX

POSIX yêu cầu -1như mặc định bất cứ khi nào đầu ra không đến thiết bị đầu cuối:

Thông số POSIX :

Định dạng mặc định sẽ là liệt kê một mục nhập trên mỗi dòng cho đầu ra tiêu chuẩn; các ngoại lệ là cho các thiết bị đầu cuối hoặc khi một trong các tùy chọn -C, -m hoặc -x được chỉ định. Nếu đầu ra là một thiết bị đầu cuối, định dạng được xác định theo thực hiện.

Ba tùy chọn ghi đè định dạng cột đơn mặc định là:

-C
Viết đầu ra đa văn bản-cột với các mục được sắp xếp xuống các cột, theo trình tự đối chiếu. Số lượng cột văn bản và các ký tự phân tách cột không được chỉ định, nhưng phải được điều chỉnh theo tính chất của thiết bị đầu ra. Tùy chọn này vô hiệu hóa đầu ra định dạng dài.

-m
Định dạng đầu ra luồng; liệt kê tên đường dẫn trên trang, được phân tách bằng ký tự <dấu phẩy> theo sau là ký tự <dấu cách>. Sử dụng ký tự <newline> làm dấu kết thúc danh sách và sau chuỗi phân tách khi không có chỗ trên một dòng cho mục nhập danh sách tiếp theo. Tùy chọn này vô hiệu hóa đầu ra định dạng dài.

-x
Giống như -C, ngoại trừ đầu ra nhiều cột văn bản được tạo ra với các mục được sắp xếp trên, thay vì xuống, các cột. Tùy chọn này vô hiệu hóa đầu ra định dạng dài.

Tài liệu GNU

Từ hướng dẫn sử dụng GNU ls :

'-1'
'--format = cột đơn'
Liệt kê một tệp trên mỗi dòng. Đây là mặc định cho ls khi đầu ra tiêu chuẩn không phải là một thiết bị đầu cuối . Xem thêm các tùy chọn -b và -q để chặn đầu ra trực tiếp của các ký tự dòng mới trong một tên tệp. [Nhấn mạnh thêm]

Ví dụ

Hãy tạo ba tệp:

$ touch file{1..3}

Khi đầu ra đi đến một thiết bị đầu cuối, GNU lschọn sử dụng định dạng nhiều cột:

$ ls
file1  file2  file3

Khi đầu ra đi đến một đường ống, thông số POSIX yêu cầu cột đơn là mặc định:

$ ls | cat
file1
file2
file3

Ba trường hợp ngoại lệ ghi đè hành vi cột đơn mặc định được -mphân tách bằng dấu phẩy, -Ccho các cột được sắp xếp xuống và -xcho các cột được sắp xếp trên:

$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1  file2  file3
$ ls -x | cat
file1  file2  file3

"POSIX yêu cầu -1 làm mặc định khi đầu ra đi đến một thiết bị đầu cuối:" ... nhưng trích dẫn chỉ ra rằng nó yêu cầu -1như mặc định trừ khi đầu ra đi đến thiết bị đầu cuối (hoặc các điều kiện khác)
muru

@muru Cảm ơn vì đã bắt được nó! Trả lời cập nhật.
John1024

Vâng, mỗi đám mây có một lớp lót bạc. Bởi vì câu trả lời của bạn đã được chấp nhận trước khi tôi đăng lên, tôi đã nhận được một chiếc mũ pizza ngộ nghĩnh!
G-Man nói 'Phục hồi Monica'

@ G-Man Rất tốt. Và, một chiếc mũ đẹp trai đó là!
John1024

9
  • Tại sao đường ống đầu ra tiêu chuẩn thay đổi hành vi của ls? Bởi vì nó được thiết kế theo cách đó. Các POSIX Specification nói:

    Định dạng mặc định sẽ là liệt kê một mục nhập trên mỗi dòng cho đầu ra tiêu chuẩn; các trường hợp ngoại lệ là đến thiết bị đầu cuối hoặc khi một trong những -C, -mhoặc -xtùy chọn được chỉ định. Nếu đầu ra là một thiết bị đầu cuối, định dạng được xác định theo thực hiện.

    mà thực sự mơ hồ về hành vi mặc định (khi không được chỉ định bởi một tùy chọn như -lhoặc -1) với đầu ra cho thiết bị đầu cuối và tài liệu GNU Coreutils nói

    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.

    Vì vậy, bạn có thể thấy rằng đầu ra cho một tệp sẽ hoạt động giống như đầu ra cho một đường ống; đó là, một mục nhập trên mỗi dòng, như thể -1đã được chỉ định.

  • Tại sao nó được thiết kế theo cách đó? Có thể không thể biết chắc chắn (trừ khi ai đó có thể tìm thấy một số ghi chú thiết kế), nhưng tôi đoán:
    • Khi lsđang viết cho một thiết bị đầu cuối, nó hy vọng rằng một con người đang nhìn vào đầu ra. Mọi người sẽ thích nhận thông tin với số lượng dòng tối thiểu cần thiết, vì vậy công cụ không cuộn màn hình.
    • Khi lsđang ghi vào một đường ống, nó hy vọng rằng một chương trình khác đang đọc đầu ra. Chương trình đọc dữ liệu là một giá trị trên mỗi dòng dễ dàng hơn nhiều so với việc phải phân tích các cột (vì tên tệp có thể chứa khoảng trắng).
  • Có bao giờ một lý do để thích ls -1 khi bạn viết vào một tập tin hoặc một đường ống? Không.

-4

Khi đường ống ls, ls không thể xác định được bao nhiêu cột mà bàn điều khiển thực sự có (độc lập với lệnh bên phải). Vì vậy, tôi chỉ thực hiện điều đó theo sự lựa chọn của riêng mình, hay nói cách khác, hành vi này không ổn định và có thể thay đổi trong các phiên bản trong tương lai.

Ngược lại, ls -1được tạo ra cho mục đích đếm hoặc viết kịch bản nói chung, vì vậy hành vi của nó là ổn định.


9
Như các câu trả lời khác nói rằng hành vi này được POSIX yêu cầu, vì vậy gọi nó không ổn định là sai.
Henrik - ngừng làm tổn thương Monica
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.