Jawaban:
Jawaban singkat :
Karena diprogram untuk mengabaikan beberapa penggunaan bendera.
Jawaban panjang:
Seperti yang Anda lihat dalam kode sumber dari ls
, ada bagian dengan fungsi getopt_long()
dan kasus switch besar:
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 }
Fungsi getopt_long()
membaca semua parameter yang diberikan ke program. Dalam hal jika -l
variabel format
diatur. Jadi, ketika Anda mengetik banyak -lllllllll
variabel itu ditetapkan beberapa kali, tetapi itu tidak mengubah apa pun.
Yah, itu mengubah satu hal. Pernyataan switch case yang sangat besar ini harus dijalankan berkali-kali, karena beberapa -l
flag. ls
perlu lebih lama untuk menyelesaikan dengan beberapa -l
flag. Tapi kali ini tidak layak disebut. =)
Karena itu hal yang benar untuk dilakukan. Misalkan Anda memiliki skrip yang melakukan sesuatu seperti:
ls $LS_OPTIONS -l "$dir"
dimana mungkin yang $LS_OPTIONS
sudah berisi -l
. Ini akan menjadi kontra-intuitif dan menjengkelkan untuk perintah ini untuk menghasilkan kesalahan dan akan membutuhkan logika tambahan dalam skrip untuk menghindarinya.
-l
mungkin bukan contoh terbaik untuk ini, tetapi mudah-mudahan Anda dapat melihat bagaimana konsep ini berlaku secara umum. Contoh yang jauh lebih baik adalah opsi kompiler $CFLAGS
yang dapat menduplikasi opsi eksplisit dalam permintaan khusus dari kompiler.
ls
dengan beberapa set opsi.
-l
Anda ls
sepertinya ide yang buruk, masalah yang sama kemungkinan akan muncul dengan opsi yang bagus di ls
alias interaktif seperti -p
atau --color=auto
.
ls
. ll
mungkin alias untuk ls -l
, dan pada sistem dengan alias itu, saya bisa mengetik ll -lart
.
ls
bukan bash
perintah, tetapi eksekusi terpisah yang kebetulan Anda luncurkan bash
. Yang mengatakan, -l
hanyalah jenis bendera Boolean, yang jika ada menyebabkan ls
menggunakan format gaya panjang untuk output. Sebagian besar program hanya akan mengabaikan banyak kegunaan ( ls -ll
sama dengan ls -l -l
) dari flag-flag tersebut, walaupun ada beberapa pengecualian (sebagai contoh, jika -v
berarti 'verbose', maka suatu program dapat menginterpretasikan beberapa kegunaan untuk berarti "bahkan lebih bertele-tele").
-vvv
adalah ssh
.
aptitude moo
Alias Shell akan sangat mengganggu jika perintah seperti ls
tidak mengizinkan opsi berulang.
Misalkan Anda punya
alias ls='ls --color=auto'
alias rm='rm -i'
Kemudian, jika flag yang bertentangan tidak diizinkan, itu akan menjadi kesalahan untuk mengeluarkan perintah seperti ls --color=never
atau ls --color=auto
atau rm -i
.
Oleh karena itu, perintah ini dirancang untuk membiarkan flag yang lebih baru menimpa yang sebelumnya.
--inplace
dan --delay-updates
, misalnya.) Beberapa alat ambil saja yang terakhir; rm -if
mungkin contoh yang bagus di sana. Tetapi tidak ada konflik dalam opsi ls-l, karenanya ls -l
dan ls -ll
bukan masalah, dan itu tidak mempengaruhi eksekusi secara signifikan. Komputer bagus dalam pengulangan yang mematikan pikiran.