Tại sao ls chấp nhận chuyển đổi trùng lặp?


16

Tôi tò mò - có sự khác biệt giữa ls -lls -lllllllllllllllllllllllllllll?

Đầu ra dường như giống nhau và tôi bối rối về lý do tại sao lscho phép các công tắc trùng lặp. Đây có phải là một thực hành tiêu chuẩn trong số hầu hết các lệnh?

Câu trả lời:


17

Câu trả lời ngắn gọn :

Bởi vì nó được lập trình để bỏ qua nhiều cách sử dụng cờ.

Câu trả lời dài:

Như bạn có thể thấy trong mã nguồn của ls, có một phần với chức năng getopt_long()và trường hợp chuyển đổi lớn:

1648       int c = getopt_long (argc, argv,
1649                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650                            long_options, &oi);
      ....
1654       switch (c)
1655         {
      ....
1707         case 'l':
1708           format = long_format;
1709           break;
      ....
1964     }

Hàm getopt_long()đọc tất cả các tham số được cung cấp cho chương trình. Trong trường hợp nếu -lbiến formatđược thiết lập. Vì vậy, khi bạn nhập nhiều -lllllllllbiến đó được đặt nhiều lần, nhưng điều đó không thay đổi gì cả.

Vâng, nó thay đổi một điều. Tuyên bố trường hợp chuyển đổi lớn này phải chạy qua nhiều lần, vì nhiều -lcờ. lscần lâu hơn để hoàn thành với nhiều -lcờ. Nhưng lần này không đáng nhắc đến. =)


11
Hoặc nói cách khác, từ chối chúng sẽ là công việc cho lập trình viên nhiều hơn là bỏ qua chúng.
Đánh dấu

1
+0,5 để nói những gì tôi sẽ nói, +0,5 cho việc đi đến nguồn.
một CVn

21

Bởi vì đó là điều đúng đắn. Giả sử bạn đã có một kịch bản làm một cái gì đó như:

ls $LS_OPTIONS -l "$dir"

nơi mà nó có thể $LS_OPTIONSđã chứa -l. Nó sẽ phản tác dụng và gây khó chịu cho lệnh này để tạo ra lỗi và sẽ yêu cầu thêm logic trong tập lệnh để tránh nó.

-lcó thể không phải là ví dụ tốt nhất cho điều này, nhưng hy vọng bạn có thể thấy khái niệm này áp dụng chung như thế nào. Một ví dụ tốt hơn nhiều là các tùy chọn trình biên dịch trong $CFLAGSđó có thể trùng lặp các tùy chọn rõ ràng trong một lệnh gọi cụ thể của trình biên dịch.


4
Điều tương tự cũng có thể xảy ra nếu bạn đã xác định một bí danh gọi lsvới một số tùy chọn.
kasperd

1
@kasperd: Vâng. Mặc dù việc đặt bí danh -lcủa bạn lscó vẻ như là một ý tưởng tồi, nhưng vấn đề tương tự có thể xảy ra với các tùy chọn tốt trong một lsbí danh tương tác như -phoặc --color=auto.
R ..

1
Bí danh không cần phải được gọi ls. llcó thể là bí danh ls -lvà trên một hệ thống có bí danh đó, tôi có thể gõ ll -lart.
kasperd

11

lskhông phải là một bashlệnh, mà là một lệnh thực thi riêng mà bạn tình cờ khởi chạy từ đó bash. Điều đó nói rằng, -lchỉ là một loại cờ Boolean, mà nếu hiện tại nguyên nhân lssử dụng định dạng kiểu dài cho đầu ra. Hầu hết các chương trình sẽ đơn giản bỏ qua nhiều cách sử dụng ( ls -llgiống như ls -l -l) các cờ như vậy, mặc dù có một số trường hợp ngoại lệ (ví dụ: nếu -vcó nghĩa là 'dài dòng', thì một chương trình có thể diễn giải nhiều cách sử dụng có nghĩa là "thậm chí dài dòng hơn").


2
Một ví dụ về -vvvssh.
Bernhard

Hoặc thậm chíaptitude moo
Ruslan

8

Các bí danh Shell sẽ khá khó chịu nếu các lệnh như lskhông cho phép các tùy chọn lặp lại.

Giả sử bạn đã có

alias ls='ls --color=auto'
alias rm='rm -i'

Sau đó, nếu các cờ xung đột không được phép, đó sẽ là một lỗi khi đưa ra các lệnh như ls --color=neverhoặc ls --color=autohoặc rm -i.

Do đó, các lệnh này được thiết kế để cho các cờ sau ghi đè lên các lệnh trước đó.


Công tắc xung đột đôi khi không được phép. (Thử rsync với cả hai --inplace--delay-updates, ví dụ.) Một số công cụ chỉ mất bất kỳ thứ gì đến sau cùng; rm -ifcó lẽ là một ví dụ tốt ở đó. Nhưng không có xung đột trong tùy chọn -l của ls, do đó ls -lls -llkhông phải là vấn đề và nó không ảnh hưởng đến việc thực hiện theo bất kỳ cách thức quan trọng nào. Máy tính là tốt trong việc lặp đi lặp lại tâm trí.
một CVn
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.