![Verwenden von "](https://rvso.com/image/97241/Verwenden%20von%20%22.png)
Regelmäßig habe ich die folgende Syntax gesehen:
awk 'stuff' <file
sort <file
Die Sache ist, ich schreibe normalerweise:
awk 'stuff' file
sort file
Und alles funktioniert perfekt. Wenn also beide Syntaxen ungefähr gleichwertig sind (oder sind sie das?), bringt die Verwendung von <file
Syntax dann einen Vorteil?
BEARBEITEN
Einige meiner Fragen werden in vorhandenen Threads behandelt (die Verwendung <
impliziert, dass die Shell die Datei öffnetErsteUndDannübergibt es als Standardeingabe an den Befehl), aber ich habe das Gefühl, dass einige übrig bleiben:
- POSIX-Kompatibilität?
- Sollen etwaige Unklarheiten hinsichtlich der Art des
file
Arguments beseitigt werden? - Ist es spezifisch für einen bestimmten Shell-Typ?
- Gilt es als veraltet?
- Gibt es hinsichtlich der Leistung einen nennenswerten Unterschied?
- Jedes Beispiel, bei dem Sie das eine gegen das andere verwenden würden, ist willkommen.
Antwort1
Beides funktioniert, wenn der Befehl das Lesen von der Standardeingabe (dem command <file
Formular) oder aus einer benannten Datei in der Argumentliste unterstützt. tcsh
Unterstützt sogar command <file
das Lesen, sodass die Syntax relativ portierbar ist. Ob ein bestimmter Befehl eine Datei in der Argumentliste (oder der Standardeingabe) lesen kann, hängt vom Befehl ab. ed(1)
Beispielsweise liest Befehle von der Standardeingabe, kann also keine Datei von der Standardeingabe lesen.
Auf der C-Ebene führt ein Befehl, der von der Standardeingabe oder einer benannten Datei liest, etwa Folgendes aus:
#include <err.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fhandle;
// option processing here ...
if (argc == 0 || strncmp(*argv, "-", (size_t) 2) == 0) {
fhandle = stdin;
} else {
if ((fhandle = fopen(*argv, "r")) == NULL)
err(1, "could not open '%s'", *argv);
}
// read from fhandle here, which is either from stdin or a file ...
}
Einige Befehle erfordern die command -
Form, um ein Lesen von der Standardeingabe anzuzeigen, andere tun dies automatisch (wie im oben genannten Code), wenn die Argumentliste leer ist. Andernfalls befasst sich der Code in beiden Fällen mit fhandle
und kümmert sich nicht darum, woher die Eingabe kommt (es sei denn, eine Fehlermeldung muss den Dateinamen enthalten, aber das kann in eine zusätzliche Variable eingefügt werden).