Câu trả lời:
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 -l
biến format
được thiết lập. Vì vậy, khi bạn nhập nhiều -lllllllll
biế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 -l
cờ. ls
cần lâu hơn để hoàn thành với nhiều -l
cờ. Nhưng lần này không đáng nhắc đến. =)
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ó.
-l
có 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.
ls
với một số tùy chọn.
-l
của bạn ls
có 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 ls
bí danh tương tác như -p
hoặc --color=auto
.
ls
. ll
có thể là bí danh ls -l
và trên một hệ thống có bí danh đó, tôi có thể gõ ll -lart
.
ls
không phải là một bash
lệ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, -l
chỉ là một loại cờ Boolean, mà nếu hiện tại nguyên nhân ls
sử 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 -ll
giố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 -v
có 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").
-vvv
là ssh
.
aptitude moo
Các bí danh Shell sẽ khá khó chịu nếu các lệnh như ls
khô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=never
hoặc ls --color=auto
hoặ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 đó.
--inplace
và --delay-updates
, ví dụ.) Một số công cụ chỉ mất bất kỳ thứ gì đến sau cùng; rm -if
có 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 -l
và ls -ll
khô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í.