Bei einigen Befehlen ist es möglich, bestimmte Eingaben entweder als stdin oder als Befehlszeilenargument anzugeben.
Insbesondere suppose command
kann nehmen stdin Eingang und einen Dateinamen als Befehlszeilenargument, und command < myfile
, cat myfile | command
und command myfile
kann das gleiche Ergebnis erzeugen.
Beispielsweise,
Wenn der Befehl lautet sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Wenn der Befehl lautet cat
:
cat < myfile
cat myfile
- Ich habe mich gefragt, ob es einige allgemeine Regeln für ihre Leistungen gibt, dh welche davon ist normalerweise die effizienteste und welche die am wenigsten?
- Ist die Umleitung immer besser als die Pipe?
Antworten:
Die
cat file | command
Syntax wird als nutzlose Verwendung von angesehenCat
. Von all Ihren Optionen ist ein Leistungseinbruch erforderlich, da ein anderer Prozess im Kernel erzeugt werden muss. So unbedeutend dies auch sein mag, es ist ein Overhead, den die anderen Formen nicht haben. Dies wurde unter anderem behandelt: Sollte ich mich um unnötige Katzen kümmern?Zwischen den beiden anderen Formen gibt es praktisch keine Leistungsunterschiede. STDIN ist ein spezieller Dateiknoten, den der Prozess wie jeder andere öffnen und lesen muss. Wenn Sie einen Dateinamen anstelle von STDIN übergeben, wird nur eine andere Datei geöffnet.
Der Unterschied besteht darin, welche Funktionen / Flexibilität Sie suchen.
sed -i
für die direkte Bearbeitung. (Hinweis: Da hierdurch hinter den Kulissen eine neue Datei erstellt werden muss, ist dies kein Leistungsgewinn gegenüber anderen Weiterleitungen, sondern ein praktischer Schritt.)sed [exp] < file1 file2
oder sogarsed [exp] < <(grep command)
. Details zu diesem Anwendungsfall finden Sie in dieser Frage: Prozessersetzung und Pipequelle
sed [exp] < <(grep command)
funktioniert einwandfrei alssed [exp] <(grep command)
(da<(grep command)
eine benannte temporäre Datei für die Länge des Befehls erstellt wird, diesed
ohne Shell-Unterstützung problemlos von selbst geöffnet werden kann).Angesichts der Tatsache, dass
command file
nur die Datei geöffnet wird und von da an so funktioniert, als ob es so wärestdin
, gibt es kaum einen Unterschied. Bei der Shell-Umleitung öffnen Sie die Datei einfach vorher (Shell tut dies), im Gegensatz zum Befehl binär selbst.Wenn wir über
cat file | command
vs. sprechencommand <file
, wird letzteres bevorzugt. Sie werden keinen signifikanten Leistungsunterschied zwischen den beiden bemerken, aber der erstere ist unnötig kompliziert (zusätzlicher Prozess und gemeinsam genutzter Speicherpuffer für die Pipe mit begrenztem Durchsatz). Sie können auch nichtseek
(die Dateizeigerposition willkürlich ändern) in a Pipe, während Sie in einer gewöhnlichen Datei können. Einige Befehle verwenden möglicherweise einen effizienteren Algorithmus, wennseek
-ing in der Eingabedatei möglich ist.quelle
<file
? Ihr Punkt ist gültig für die Verwendung des Eingabedateinamens, um den Namen der Ausgabedatei abzuleiten, z . B.:gzip file
Erzeugtfile.gz
.close
sstdin
und ruftdup
den geöffneten Dateideskriptor auf, sodass er den alten ersetztstdin
(was in den meisten Fällen eine Art tty war). Aus Sicht des Movie Players gibt es keinen Unterschied zwischen dem und dem Öffnen der Datei anhand ihres Namens in der Spieler selbst. Der Dateideskriptor ist in beiden Szenarien suchbar. Wenn wir also zum Ende springen, gibt es keinen vom Benutzer erkennbaren Unterschied.