Warum verwendet cat keine Optionen so, wie ich es von UNIX-Programmen erwartet, um Switches zu verwenden?

437
Chas. Owens

Ich bin seit mehr als UNIX-Benutzer, als ich darüber nachdenken möchte, und in dieser Zeit habe ich gelernt, zu erwarten, dass bei einem widersprüchlichen Wechsel eines Programms der letzte gewinnt. Das habe ich kürzlich bemerkt

cat -bn file 

und

cat -nb file 

Beide verwenden die -bOption (Anzahl nicht leerer Zeilen) über die -nOption (Nummer alle Zeilen). Ich bekomme dieses Verhalten sowohl unter BSD als auch unter Linux, daher glaube ich nicht, dass es sich um eine Implementierung handelt. Ist das etwas, das irgendwo angegeben ist, und bin ich einfach verrückt, weil ich erwartet habe, dass das erste Beispiel alle Zeilen nummeriert?

4
Sie sagen, dass "-b" leere Zeilen enthält. Tatsächlich werden ** nicht leere ** Zeilen gemäß jeder Manpage (Ubuntu / GNU, FreeBSD, HP / UX) nummeriert. Dennis Williamson vor 13 Jahren 0
@Dennis Williamson, ja, du hast recht, das ist ein Tippfehler. Chas. Owens vor 13 Jahren 0

2 Antworten auf die Frage

5
coneslayer

I took a look at the FreeBSD source code for cat(1), and the relevant source lines are:

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

So this looks like a deliberate design decision; the interpretation of -b is that it modifies the behavior of -n, rather than -b and -n being two mutually exclusive alternatives.

Dies ist eine ungerade Entscheidung, da dokumentiert wird, dass sie sich unterschiedlich verhält (Anzahl aller Zeilen gegenüber der Anzahl Leerzeilen). Wenn "-n" zu "Zahlenzeilen" ohne das Wort "Alle" dokumentiert wäre, würde ich dem Code zustimmen. Hmm, aber auf der BSD-Manpage heißt es "Nummeriere die Ausgabezeilen, beginnend bei 1", also ist dies wirklich nur ein Problem mit der Dokumentation von GNU cat. Chas. Owens vor 13 Jahren 0
1
kmarsh

Most system commands use C standard library getopt(3) or some variation, and parse the options from left to right. So, as you observed, last one wins.

Das erwartet er, aber wenn er danach fragt, gewinnt der letzte nicht. coneslayer vor 13 Jahren 0
Sie haben das bereits abgedeckt. Ich erklärte, warum der gewöhnliche Mechanismus normalerweise die Argumente ganz rechts bevorzugt. kmarsh vor 13 Jahren 0