Warum verwendet cat options nicht so, wie ich es von UNIX-Programmen erwarte?

4

Ich bin seit mehr Jahren ein UNIX-Benutzer, als ich denken möchte, und in dieser Zeit wurde ich darauf trainiert, zu erwarten, dass der letzte gewinnt, wenn widersprüchliche Schalter an ein Programm vergeben werden. Kürzlich habe ich das bemerkt

cat -bn file

und

cat -nb file

Beide verwenden die -bOption (nummerieren Sie nicht leere Zeilen) über der -nOption (nummerieren Sie alle Zeilen). Ich habe dieses Verhalten sowohl unter BSD als auch unter Linux, daher halte ich es nicht für eine Implementierungs-Eigenheit. Ist das irgendwo spezifiziert und bin ich nur verrückt, wenn ich erwarte, dass das erste Beispiel alle Zeilen nummeriert?

Chas. Owens
quelle
Sie sagen, dass -bZahlen Leerzeilen. Tatsächlich werden nicht-leere Zeilen entsprechend jeder Manpage nummeriert, die ich angeschaut habe (Ubuntu / GNU, FreeBSD, HP / UX).
Dennis Williamson
@ Tennis Williamson, ja, du hast recht, das ist ein Tippfehler.
Chas. Owens

Antworten:

5

Ich habe mir den FreeBSD-Quellcode für cat (1) angesehen und die relevanten Quelltextzeilen lauten:

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

Das sieht also nach einer bewussten Designentscheidung aus. die Interpretation -bist , dass es das Verhalten ändert -n, statt -bund -nsind zwei sich gegenseitig ausschließende Alternativen.

Kegeltöter
quelle
Das ist eine seltsame Entscheidung, da dokumentiert ist, dass sie sich unterschiedlich verhalten (nummerieren Sie alle Zeilen gegenüber den leeren Zeilen). Wenn -nin "Nummernzeilen" ohne das Wort "alle" dokumentiert wäre, würde ich dem Code zustimmen. Hmm, aber auf der BSD-Manpage steht "Number the output lines, starting at 1", also ist dies wirklich nur ein Problem mit der Dokumentation von GNU cat.
Chas. Owens
1

Die meisten Systembefehle verwenden die C-Standardbibliothek getopt (3) oder eine Variation und analysieren die Optionen von links nach rechts. Wie Sie gesehen haben, gewinnt der Letzte.

kmarsh
quelle
Das ist das Verhalten, das er erwartet, aber für den Fall, dass er danach fragt, gewinnt der Letzte nicht.
Coneslayer
Sie haben das bereits behandelt. Ich habe erklärt, warum der übliche Mechanismus normalerweise die Argumente ganz rechts bevorzugt.
kmarsh