Komut seçeneklerinin önceliği?


21

Bana sormadan rm -f file1zorla kaldırılacağını biliyorum file1.

Ayrıca rm -i file1çıkarmadan önce beni yönlendireceğini de biliyorumfile1

Şimdi yürütürseniz rm -if file1, bu file1bana sorulmadan da zorla kaldırılacak .

Ancak, yürütürseniz rm -fi file1, kaldırmadan önce beni uyarır file1.

Öyleyse, komut seçeneklerini birleştirirken sonuncusunun öncelikli olacağı doğru mu? gibi rm -if, o -fzaman öncelikli olur, ama rm -fisonra -iöncelikli olur.

lsEğer dese mesela komut, önemli değil ls -latRya ls -Rtal.

Bu yüzden, sadece bunun gibi çelişkili komut seçenekleriniz olduğunda önemli rm -if, doğru mu?


Yanıtlar:


23

Her rmikisi de -ive -f seçenekleri ile kullanırken , ilk göz ardı edilir. Bu POSIX standardında belgelenmiştir :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

ve ayrıca GNU infosayfasında:

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

Kaputun altında ne olduğunu görelim:

rmseçeneği ile getopt(3)özellikle işler getopt_long. Bu işlev, komut satırındaki seçenek değişkenlerini **argvgörünüm sırasına göre işler :

Getopt () art arda çağrılırsa, seçenek öğelerinin her birinden art arda seçenek karakterlerinin her birini döndürür.

Bu fonksiyon tipik olarak tüm seçenekler işlenene kadar bir döngüde çağrılır. Bu fonksiyonlar açısından seçenekler sırayla işlenir. Bununla birlikte, gerçekte olan şey, uygulama mantığı çakışan seçenekleri algılamayı, bunları geçersiz kılmayı veya bir hata sunmayı seçebildiğinden uygulamaya bağlıdır. Durumunda için rmve ive fseçenekleri, onlar mükemmel yazma birbirinden. Kimden rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

Her iki seçenek de aynı değişkenleri ayarlar ve bu değişkenlerin durumu komut satırında en son seçenek hangisi olursa olur. Bunun etkisi POSIX standardı ve rmdokümantasyonu ile aynı çizgidedir .


3
Komutların çoğu argümanlarını sırayla işler ve çatışmalarda hata yapar veya son ayarı yapar (gibi rm). Bir komutun, bir seçeneğin ilk ayarını yapması ve önceden ayarlanmış bir seçeneği değiştirecek kısaltmaları yoksaymasının nadir olduğunu düşünüyorum.
Peter Cordes

7

Evet, rmbunun için geçerlidir. Son seçenek öncekileri geçersiz kılarsa, bireysel programın kendisine göre değişir. “Bilgi” den

'-f' '--force' Var olmayan dosyaları ve eksik işleçleri yoksay ve kullanıcıya sorma. Önceki herhangi bir - - etkileşimli '(' -i ') seçeneğini yoksay.

'-i' Her dosyanın kaldırılıp kaldırılmayacağını sor. Yanıt olumlu değilse, dosya atlanır. Önceki '--force' ('-f') seçeneğini yoksay. '--Ractive = always' ifadesine eşdeğerdir.

Genel bir ipucu olarak: infogenellikle seçeneğinden mandaha ayrıntılı olan genellikle kendisinden daha ayrıntılıdır --help.


7

Bayraklar için “öncelik” yoktur, her program onları istediği şekilde idare eder. Çoğu standart bayraklar (referanslar gibi) için tüm bayrakları toplamak ve çatışmaları kontrol etmek için çaba gösterir.rm(1) ) ilgili standartlar bir şeyi zorunlu kılabilir (ancak daha sonra, belirli sürümünüz standardın köşe davalarını yorumlamada özensiz olabilir / özel olarak test edilmemiş onlar için).

Programcının programı yazması için, argümanları (bayraklar ve diğerleri) kesinlikle soldan sağa sırayla düşünmek ve belki de bazı engellere çarptığında kurtulmak en kolay yoldur. Bayrakları işlemek için bir kütüphane kullanıyorsanız ( getopt(3)etrafta dolaşan birkaç sürüm var), programcı muhtemelen en kolay / doğal olanı yapar. Programcılar insandır, insanlar tembeldir (ya da en azından birleşik patlama yoluyla düşünmeye düşkün değildir).

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.