Was macht ein nackter <?

10

bash scheint sich nicht zu beschweren, wenn Sie einen Befehl wie ausführen

$ < some-file-that-exists

Nichts scheint zu passieren.

Sie könnten auch verwenden

$ <<<"any string"

und sogar Prozesssubstitution.

Was genau macht das und warum ist es erlaubt? Könnte es für irgendetwas nützlich sein?

Explosionspillen
quelle
Übrigens: Für den großen ZSH ist "<foobar" dasselbe wie "less foobar", da Sie foobar zur Shell umleiten. Ich denke, das ist ein ziemlich intuitives Verhalten. Ein Bare <gibt Ihnen einen Fehler ( zsh: parse error near `\n'), da kein Argument angegeben wird.
Mathe
@math Sie werden einen ähnlichen Fehler in bekommen bash, aber das ist interessant über less.
Explosion Pills

Antworten:

20

<Richtet die Umleitung für einen Befehl ein, der vor oder nach den Umleitungsanweisungen erfolgen kann. Dh

$ < file wc

funktioniert so gut wie

$ wc < file

Wenn Sie jedoch keinen Befehl geben, richtet bash die Umleitung ein und führt nichts anderes aus. Bei der Umleitung von Eingaben entspricht dies dem, was Sie gesehen haben, nichts, wenn die Datei vorhanden und lesbar ist. Wenn die Datei nicht existiert oder nicht lesbar ist, signalisiert bash einen Fehler. Für die Umleitung der Ausgabe wird die Ausgabedatei erstellt, wenn sie nicht vorhanden ist. Alle vorhandenen Ausgabedateien werden abgeschnitten, wenn sie >verwendet werden. Keine Kürzung, wenn >>verwendet wird.

Kyle Jones
quelle
Mit anderen Worten, sie sind eine prägnante existiert und erstellen
Ratschenfreak
@ Kyle Jones Ich denke, Sie haben die beiden Operatoren im letzten Satz nicht zusammengebracht.
Jamesbtate
@Puddingfox Danke. Ich habe den Folgesatz am Ende bearbeitet, um dies zu verdeutlichen.
Kyle Jones
Gibt es einen Grund zu verwenden < file wcvs. wc < file?
Explosion Pills
1
@tandu Es ist praktisch, wenn Sie interaktive Shells verwenden. Angenommen, Sie haben einen Befehl, der die Umleitung verwendet, und Sie möchten ihn mit einem anderen letzten Argument wiederholen. Wenn sich die Umleitung am Anfang der Zeile befindet, können Sie einfach control-P eingeben und dann das letzte Argument bearbeiten, ohne die Sprache "<foo> bar 2> & 1" wie am Ende überspringen zu müssen. Darüber hinaus habe ich keine Verwendung dafür gefunden.
Kyle Jones
5

<liest standardmäßig von stdin oder einer Datei. Ihr Ausdruck hat nichts mit der Eingabe zu tun, da Sie nach dem Lesen nichts getan haben.

Wenn Sie am Ende die Ausgabedatei <eine Datei, die existiert> ausführen, werden Sie feststellen, dass Sie gerade den Inhalt der ersten Datei eingelesen und in die zweite Datei geschrieben haben.

<<< ist hier das Dokumentformat, also liest es aus einer Zeichenfolge statt aus einer Datei. cat <<< "any string", um zu sehen, was Sie gelesen haben.

johnshen64
quelle
2
Zum späteren Nachschlagen bearbeiten Sie bitte Ihre Antwort, um Details hinzuzufügen, anstatt einen Kommentar hinzuzufügen
Nate Koppenhaver
2
"Wenn Sie am Ende die Ausgabedatei <eine-Datei-die-existiert> ausführen, werden Sie feststellen, dass Sie gerade den Inhalt der ersten Datei eingelesen und in die zweite Datei geschrieben haben." Das ist falsch; Ohne Befehl wird die Ausgabedatei auf null Byte gekürzt.
Kyle Jones