Neden ls yinelenen anahtarları kabul ediyor?


16

Merak ediyorum - ls -lve arasında bir fark var ls -lllllllllllllllllllllllllllllmı?

Çıktı aynı gibi görünüyor ve neden lsyinelenen anahtarlara izin verdiğine kafam karıştı . Bu, çoğu komut arasında standart bir uygulama mıdır?

Yanıtlar:


17

Kısa cevap :

Çünkü bir bayrağın birden fazla kullanımını göz ardı etmek için programlanmıştır.

Uzun cevap:

İçinde görebileceğiniz gibi kaynak kodu arasında ls, işlevi ile bir parçası olduğunu getopt_long()ve büyük bir anahtar durumunda:

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     }

Fonksiyon getopt_long(), programa verilen tüm parametreleri okur. Durumda ise -ldeğişken formatayarlanır. Bu nedenle, birden fazla -lllllllllyazdığınızda, bu değişken birden çok kez ayarlanır, ancak bu hiçbir şeyi değiştirmez.

Bir şeyi değiştiriyor. Bu büyük anahtar durum ifadesi, birden çok -lbayrak nedeniyle birden çok kez çalıştırılmalıdır . lsbirden çok -lbayrakla tamamlanması gerekiyor . Ancak bu kez bahsetmeye değmez. =)


11
Ya da başka bir deyişle, onları reddetmek, programcı için onları görmezden gelmekten daha fazla iş olacaktır.
Mark

1
Ne diyeceğimi söylediğim için +0.5, kaynağa gittiğim için +0.5.
CVN

@Mark - Neden programcı için daha fazla iş?
Ryan

@Ryan, fazladan bir "l" seçeneğini reddetmek, kaç tanesinin görüldüğünü izlemeyi ve çok fazla varsa bir hata mesajı yazdırmayı gerektirir. Ekstra "l" seçeneklerini göz ardı etmek, bir "l" göründüğünde biçim stilinin "long_format" olarak ayarlanmasını gerektirir.
Mark

@ Mark - l sayısını gerçekleştirmenin daha kolay olduğunu düşünürdüm ve 1'i aşarsa bir hata yazdırın.
Ryan

21

Çünkü yapılacak doğru şey bu. Diyelim ki bir komut dosyası kullandınız:

ls $LS_OPTIONS -l "$dir"

$LS_OPTIONSzaten içerdiği olası -l. Bu komutun bir hata üretmesi karşı sezgisel ve sinir bozucu olurdu ve bundan kaçınmak için kodda ekstra mantık gerektirir.

-lbunun en iyi örneği olmayabilir, ancak umarım kavramın genel olarak nasıl uygulandığını görebilirsiniz. Çok daha iyi bir örnek, derleyicinin $CFLAGSbelirli bir çağrısında açık seçenekleri çoğaltabilecek derleyici seçenekleridir .


4
Aynı şey ls, bazı seçeneklerle çağıran bir takma ad tanımladıysanız da olabilir .
kasperd

1
@kasperd: Evet. Takma -ladınızı koymak lskötü bir fikir gibi görünse de, aynı sorunun veya lsgibi etkileşimli bir takma adda güzel seçeneklerle ortaya çıkması muhtemeldir . -p--color=auto
R .. GitHub BUZA YARDIMCI DURDUR

1
Takma adın çağrılması gerekmez ls. lliçin bir takma ad olabilir ls -lve bu takma adı olan bir sistemde yazabilirim ll -lart.
kasperd

11

lsbir bashkomut değil , başlattığınız ayrı bir yürütülebilir dosyadır bash. Bununla birlikte, -leğer mevcutsa lsçıktı için uzun bir stil formatına neden olan sadece bir Boolean bayrağı türüdür . Çoğu program basitçe bu tür bayrakların birden fazla kullanımını görmezden gelir ( ls -llaynıdır ls -l -l), ancak bazı istisnalar olsa da (örnek olarak, -v'ayrıntılı' anlamına gelirse , bir program birden fazla kullanımı "daha ayrıntılı" olarak yorumlayabilir).


2
Bir örnek -vvvIS ssh.
Bernhard

Hatta çiftaptitude moo
Ruslan

8

Kabuk takma adları, gibi komutlar lstekrarlanan seçeneklere izin vermezse oldukça can sıkıcı olurdu .

Varsayalım

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

Çelişkili bayrakları izin verilmedi Sonra, bu bir benzeri sorunu komutlarına hata olurdu ls --color=neverya ls --color=autoya rm -i.

Bu nedenle, bu komutlar sonraki bayrakların önceki komutları geçersiz kılmasına izin verecek şekilde tasarlanmıştır.


Çakışan anahtarlara bazen izin verilmiyor. (Rsync'i her ikisiyle de deneyin --inplaceve --delay-updatesörneğin.) Bazı araçlar en son gelenleri alır; rm -ifmuhtemelen iyi bir örnektir. Ama ls en -l seçeneğinde hiçbir çatışma dolayısıyla olduğunu ls -lve ls -llbir sorun değildir ve herhangi bir anlamlı şekilde yürütülmesini etkilemez. Bilgisayarlar zihin uyuşmazlığı konusunda iyidir.
CVN
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.