Von https://unix.stackexchange.com/a/458074/674
Denken Sie daran,
--
wenn Sie willkürliche Argumente an Befehle übergeben (oder wenn möglich, Umleitungen verwenden). Sosort -- "$f1"
oder bessersort < "$f1"
stattsort "$f1"
.
Warum wird die Verwendung --
und Umleitung bevorzugt ?
Warum wird es sort < "$f1"
vorgezogen sort -- "$f1"
?
Warum wird es sort -- "$f1"
vorgezogen sort "$f1"
?
Vielen Dank.
Antworten:
Fehler für Werte
$f1
, die mit-
oder hier beginnen, fürsort
einige, die mit beginnen+
(kann schwerwiegende Konsequenzen für eine beispielsweise aufgerufene Datei haben-o/etc/passwd
).(wobei
--
das Ende der Optionen signalisiert wird) behebt die meisten dieser Probleme, schlägt jedoch für die aufgerufene Datei immer noch fehl-
(was sosort
interpretiert wird, dass sie stattdessen die Standardeingabe enthält).Hat diese Probleme nicht.
Hier ist es die Shell, die die Datei öffnet. Dies bedeutet auch, dass, wenn die Datei nicht geöffnet werden kann, eine möglicherweise nützlichere Fehlermeldung angezeigt wird (z. B. geben die meisten Shells die Zeilennummer im Skript an) und die Fehlermeldung bei Verwendung konsistent ist Umleitungen, wo immer möglich, um Dateien zu öffnen.
Und in
(im Gegensatz zu
sort -- "$f1" > out
), wenn"$f1"
nicht geöffnet werden kann,out
wird nicht erstellt / abgeschnitten undsort
nicht einmal ausgeführt.Um eine mögliche Verwirrung zu beseitigen (siehe nachfolgende Kommentare), wird der Befehl nicht daran gehindert, die Datei zu öffnen
mmap()
oder sich in der Datei zu befindenlseek()
(diessort
gilt auch nicht), vorausgesetzt, die Datei selbst ist suchbar. Der einzige Unterschied besteht darin, dass die Datei von der Shell früher und im Dateideskriptor 0 geöffnet wird, während der Befehl später möglicherweise einen anderen Dateideskriptor verwendet. Der Befehl kann immer noch nach / mmap suchen, das fd 0, wie es gefällt. Das darf nicht verwechselt werden, wenn der Standardcat file | cmd
dieses Malcmd
eine Pfeife ist, die nicht gemappt / gesucht werden kann.quelle
sort
das sequentielle Lesen der Daten erzwingt und Siemmap
die Datei nicht können. Auchsort
wenn Sie möglicherweise nicht viele Probleme damit haben, sollten Sie die Leistung vonless <file
und berücksichtigenless file
. Im ersten Fallless
muss der gesamte Inhalt der Datei im Speicher bleiben, im zweiten Fall dürfen nur die gewünschten Teile gelesen werden. Stellen Sie sich vor, dasfile
ist eine 100-GB-Protokolldatei ...less <file
alle Dateien im Speicher bleiben , aber es ist nicht gezwungen, dies ist ein Mangel von weniger. Nurcat file | less
wird dazu gezwungen. Check outless /dev/fd/0 <f
, wodurch die Datei nicht im Speicher bleibt, obwohl sie auf stdin empfangen wird. Es ist ein weit verbreitetes Missverständnis, dass stdin unter Unix nicht zu finden ist. Es kann nämlich je nach Dateityp suchbar sein.read()
Daten nacheinander aus einer Dateimmap()
gelesen werden, während die gesamte Datei gleichzeitig in den Speicher eingelesen wird?sort
POSIX, unterstützt werden. Aber es ist wahr, dass es nicht immer unterstützt wird.getopt()
C-Funktion diese Bedeutung des Arguments anerkennt--
. Der wichtigste Punkt ist jedoch der, den Sie akzeptieren: Die Behandlung von Argumenten ist die Domäne einzelner Programme und wird nicht von allen--
besonders behandelt .Das Problem sind Dateinamen, die mit einem Bindestrich beginnen.
sort "$f1"
funktioniert nicht, wenn der Wert von mitf1
beginnt,-
da der Befehl den Wert als Option interpretiert. Dies führt in der Regel zu einem Fehler, kann jedoch sogar zu einer Sicherheitslücke führen . Mitsort -- "$f1"
, die Doppelstrich Argument--
mean „keine Optionen über diesen Punkt hinaus“ , so der Wertf1
wird nicht als Option interpretiert werden. Es gibt jedoch noch einen Randfall: Wenn der Wert vonf1
ein Bindestrich ist und sonst nichts, dann ist es keine Option, sondern das Argument-
, was „Standardeingabe“ bedeutet (weil das Argument eine Eingabedatei ist; für eine Ausgabedatei) es würde "Standardausgabe" bedeuten).Durch die Verwendung der Umleitung werden alle diese Fallstricke vermieden.
Dies gilt nicht nur für die meisten Befehle
sort
.quelle
sort < "$f1"
dies funktionieren würde, wenn der Wert gleich wäre-
? Es ist in keiner Schale, die ich ausprobiert habe.seq 10 > -; sort -
mitseq 10 > -; sort < -
.