Saya ingin tahu - apakah ada perbedaan antara ls -l
dan ls -lllllllllllllllllllllllllllll
?
Outputnya tampaknya sama dan saya bingung mengapa ls
memungkinkan switch duplikat. Apakah ini praktik standar di antara sebagian besar perintah?
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:
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.sumber
ls
dengan beberapa set opsi.-l
Andals
sepertinya ide yang buruk, masalah yang sama kemungkinan akan muncul dengan opsi yang bagus dils
alias interaktif seperti-p
atau--color=auto
.ls
.ll
mungkin alias untukls -l
, dan pada sistem dengan alias itu, saya bisa mengetikll -lart
.ls
bukanbash
perintah, tetapi eksekusi terpisah yang kebetulan Anda luncurkanbash
. Yang mengatakan,-l
hanyalah jenis bendera Boolean, yang jika ada menyebabkanls
menggunakan format gaya panjang untuk output. Sebagian besar program hanya akan mengabaikan banyak kegunaan (ls -ll
sama denganls -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").sumber
-vvv
adalahssh
.aptitude moo
Alias Shell akan sangat mengganggu jika perintah seperti
ls
tidak mengizinkan opsi berulang.Misalkan Anda punya
Kemudian, jika flag yang bertentangan tidak diizinkan, itu akan menjadi kesalahan untuk mengeluarkan perintah seperti
ls --color=never
atauls --color=auto
ataurm -i
.Oleh karena itu, perintah ini dirancang untuk membiarkan flag yang lebih baru menimpa yang sebelumnya.
sumber
--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, karenanyals -l
danls -ll
bukan masalah, dan itu tidak mempengaruhi eksekusi secara signifikan. Komputer bagus dalam pengulangan yang mematikan pikiran.