Dlaczego cat nie korzysta z opcji w sposób, w jaki oczekuję, że programy UNIX będą używać przełączników?


4

Jestem użytkownikiem systemu UNIX od wielu lat, niż się nad tym zastanawiam, i w tym czasie zostałem wyszkolony, aby oczekiwać, że w przypadku podania sprzecznych przełączeń programowi wygrywa ostatni. Ostatnio to zauważyłem

cat -bn file

i

cat -nb file

oba używają -bopcji (liczba niepustych linii) nad -nopcją (numeruje wszystkie linie). Dostaję to zachowanie zarówno na BSD, jak i Linuksie, więc nie sądzę, że jest to dziwactwo implementacyjne. Czy to jest gdzieś określone i czy jestem po prostu szalony, że oczekuję, że pierwszy przykład będzie numerował wszystkie wiersze?


Mówisz, że zawiera -bpuste linie. W rzeczywistości powoduje to, że niepuste wiersze są numerowane zgodnie z każdą stroną podręcznika, którą przeglądałem (Ubuntu / GNU, FreeBSD, HP / UX).
Dennis Williamson,

@Dennis Williamson, tak, masz rację, to jest literówka.
Chas. Owens,

Odpowiedzi:


5

Wziąłem spojrzeć na kodzie źródłowym FreeBSD dla kotów (1) , oraz odpowiednie linie źródłowe są:

case 'b':
    bflag = nflag = 1;  /* -b implies -n */

Wygląda to na celową decyzję projektową; interpretacja -bjest to, że modyfikuje zachowanie -n, zamiast -bi -nbędąc dwa wzajemnie wykluczające się alternatywy.


To dziwna decyzja, ponieważ udokumentowano, że zachowują się inaczej (numeruj wszystkie linie w stosunku do liczby pustych linii). Gdyby -nzostały udokumentowane do „linii numerycznych” bez słowa „wszystkie”, zgodziłbym się z kodem. Hmm, ale patrząc na stronę BSD mówi: „Numeruj linie wyjściowe, zaczynając od 1”, więc tak naprawdę jest to tylko problem z dokumentacją GNU cat.
Chas. Owens,

1

Większość poleceń systemowych używa standardowej biblioteki C getopt (3) lub jakiejś odmiany i analizuje opcje od lewej do prawej. Tak więc, jak zauważyłeś, ostatni wygrywa.


Takie zachowanie się spodziewa, ale w przypadku, o które pyta, ostatnie nie wygrywa.
coneslayer

Już to omówiłeś. Wyjaśniałem, dlaczego zwykły mechanizm zazwyczaj faworyzuje najbardziej słuszne argumenty.
kmarsh
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.