cat < file
druckt den Inhalt der Datei nach stdout.
cat > file
liest stdin, bis Ctrl+ Derkannt wird und der Eingabetext in die Datei geschrieben wird .
cat <> file
Druckt, zumindest in meiner Version von Bash, den Inhalt der Datei zufriedenstellend (ohne Fehler), ändert jedoch weder die Datei noch den Änderungszeitstempel.
Wie rechtfertigt der Bash-Standard das scheinbar Ignorierte >
in der dritten Aussage - und was noch wichtiger ist, tut er etwas?
4<>file
ist nützlich, einen expliziten Deskriptor ( ) anzugeben, und ich nehme an, 0 ist ein ebenso guter Standard wie jeder andere, wenn Sie ihn weglassen. Lesen von stdout ist nicht besser.<>
Auf einigen Systemen (wie Linux) ist es auch nützlich, Named Pipes zu öffnen, ohne sie zu blockieren, bis ein anderer Prozess sie zum Schreiben öffnet.<>
Operator kann nützlich sein, um eine Anwendung zu schreiben, die mit mehreren Terminals funktioniert und gelegentlich eine Shell starten möchte. Diese Shell wäre wiederum nicht in der Lage, Anwendungen auszuführen, die von einem normalen steuernden Terminal ausgeführt werden, es sei denn, sie könnte<>
... wie ... den Pager verwendenmore
, der aus Standardfehlern liest, um seine Befehle abzurufen, also Standardeingabe und Standardausgabe sind beide für den üblichen Gebrauch verfügbar.cat food | more - >/dev/tty03 2<>/dev/tty03
<> file
öffnet die Datei (auf Dateideskriptor 0 (stdin) standardmäßig wie<
) in Lese + Schreibmodus ohne Abschneiden und die Erstellung der Datei , wenn es nicht vorher noch nicht gab .Das entspricht den
O_RDWR|O_CREAT
Flags, die an denopen()
Systemaufruf übergeben werden. Im Gegensatz dazu<
istO_RDONLY
und>
istO_WRONLY|O_CREAT|O_TRUNC
und>>
O_WRONLY|O_CREAT|O_APPEND
.Das Beschreiben von stdin ist nicht oft nützlich, da Anwendungen normalerweise nicht in ihre stdin schreiben. Anwendungen erwarten normalerweise nicht, dass sie in einem Dateideskriptor lesen und schreiben, den sie beim Start erhalten. Sie lesen normalerweise aus stdin (oder einem Dateideskriptor, den sie selbst öffnen) und schreiben in stdout oder stderr (oder einen Dateideskriptor, den sie selbst öffnen).
<>
kann seinen Nutzen haben:cat <> file
Sie es,cat < file
wenn der Befehl nicht fehlschlagen soll, wenn erfile
nicht vorhanden istfile
. Stattdessen wird ein leerer Befehl erstellt.Der nicht abschneidende Aspekt von
<>
macht es nützlich, Dateien an Ort und Stelle zu überschreiben. In diesem Fall verwenden Sie es jedoch im Allgemeinen nicht für den Dateideskriptor 0:ersetzt die ersten 3 Bytes von
file
mitxxx
.Auf einigen Systemen wie Linux
<>
öffnet eine Named Pipe (FIFO) die Named Pipe ohne zu blockieren (ohne darauf zu warten, dass ein anderer Prozess das andere Ende öffnet) und stellt sicher, dass die Pipe-Struktur erhalten bleibt. Zum Beispiel in:sed
verarbeitet eingehende Daten von einer beliebigen Anzahl anderer Prozesse, die darauf schreiben, und sieht sie nieeof
.quelle
<>
standardmäßig1<>
(stdout) anstelle von0<>
(stdin) verwendet wird. Dies ist ein POSIX-Kompatibilitätsfehler, den ich gemeldet habe und der in der nächsten Version behoben wird. github.com/att/ast/issues/75 Aber bis aktuelle ksh93-Versionen nicht mehr verwendet werden, müssen Sie die Dateideskriptornummer<>
angeben , um sie portabel zu verwenden .mkfifo fifo; exec 3<>fifo
würde blockieren?