Pierwszeństwo opcji poleceń?


21

Wiem, że rm -f file1to siłą usunie file1bez monitowania mnie.

Wiem również, że rm -i file1najpierw wyświetli monit przed usunięciemfile1

Teraz, jeśli wykonasz rm -if file1, to również wymusi usunięcie file1bez monitowania mnie.

Jeśli jednak wykonasz rm -fi file1polecenie, wyświetli się monit przed usunięciem file1.

Czy to prawda, że ​​łącząc opcje poleceń, ta ostatnia będzie miała pierwszeństwo? jak rm -if, wtedy -fbędzie miało pierwszeństwo, ale rm -fiwtedy -ibędzie miało pierwszeństwo.

lsKomenda na przykład, to nie ma znaczenia, jeśli powiedział ls -latRlub ls -Rtal.

Myślę, że to ma znaczenie tylko wtedy, gdy masz sprzeczne opcje poleceń rm -if, czy to prawda?


Odpowiedzi:


23

W przypadku korzystania rmz obu opcji -ii -fpierwsza z nich zostanie zignorowana. Jest to udokumentowane w standardzie POSIX :

    -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.

a także na infostronie GNU :

‘-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.

Zobaczmy, co dzieje się pod maską:

rmProcesy swojej opcji z getopt(3)konkretnie getopt_long. Ta funkcja przetwarza argumenty opcji w wierszu poleceń ( **argv) w kolejności ich wyświetlania:

Jeżeli funkcja getopt () jest wywoływana wielokrotnie, zwraca kolejno każdy ze znaków opcji z każdego elementu opcji.

Ta funkcja jest zwykle wywoływana w pętli, dopóki wszystkie opcje nie zostaną przetworzone. Z tej perspektywy funkcje są przetwarzane w kolejności. To, co faktycznie się dzieje, zależy jednak od aplikacji, ponieważ logika aplikacji może wykrywać sprzeczne opcje, zastępować je lub wyświetlać błąd. W przypadku rmi ioraz fopcje doskonale się nadpisują. Od 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;

Obie opcje ustawiają te same zmienne, a stan tych zmiennych będzie zależał od tego, która opcja będzie ostatnia w wierszu poleceń. Efekt tego jest zgodny ze standardem POSIX i rmdokumentacją.


3
Większość poleceń przetwarza argumenty w kolejności i albo błąd w konfliktach, albo przyjmuje ostatnie ustawienie (jak rm). Wydaje mi się, że polecenie rzadko przyjmuje pierwsze ustawienie opcji i ignoruje argumenty, które zmieniłyby już ustawioną opcję.
Peter Cordes,

7

Tak, ponieważ rmjest to ważne. Jeśli ostatnia opcja zastępuje poprzednie, zależy to jednak od samego programu. Od „info rm”

'-f' - --force 'Ignoruj ​​nieistniejące pliki i brakujące operandy i nigdy nie pytaj użytkownika. Zignoruj ​​każdą poprzednią opcję „--interactive” („-i”).

„-i” Pytaj, czy usunąć każdy plik. Jeśli odpowiedź nie jest twierdząca, plik jest pomijany. Zignoruj ​​każdą poprzednią opcję „--force” („-f”). Odpowiednik „--interactive = always”.

Jako ogólna wskazówka: infozwykle jest bardziej szczegółowa niż man, która sama w sobie jest zwykle bardziej szczegółowa niż --helpopcja.


7

Nie ma „pierwszeństwa” dla flag, każdy program obsługuje je tak, jak chce. Większość stara się zebrać wszystkie flagi i sprawdzić konflikty, w przypadku standardowych narzędzi (takich jak odnośniki rm(1)) odpowiednie standardy mogą wymagać czegoś (ale z drugiej strony, Twoja konkretna wersja może być niechlujna w interpretacji narożnych przypadków standardu / nie zostać specjalnie przetestowana dla nich).

Dla programisty piszącego program najłatwiej jest rozważyć argumenty (flagi i inne) w ścisłej kolejności od lewej do prawej, a być może wyskoczyć przy trafieniu w jakąś przeszkodę. Jeśli używasz biblioteki do obsługi flag (np. getopt(3)Istnieje kilka wersji unoszących się wokół), programista prawdopodobnie robi to, co przychodzi najłatwiej / naturalniej. Programiści to ludzie, ludzie są leniwi (a przynajmniej nie lubią myśleć przez kombinatoryczną eksplozję).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.