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?

Chas. Owens
źródło
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.

coneslayer
źródło
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.

kmarsh
źródło
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