Heute lerne ich etwas über FIFO mit diesem Artikel: Einführung in Named Pipes , der erwähnt cat <(ls -l)
.
Ich habe ein paar Experimente mit gemacht sort < (ls -l)
, bei denen ein Fehler auftaucht:
-bash: syntax error near unexpected token `('`
Dann habe ich festgestellt, dass ich ein zusätzliches Leerzeichen im Befehl falsch eingefügt habe.
Aber warum führt dieser zusätzliche Befehl zu diesem Fehler? Warum muss sich das Umleitungssymbol in der Nähe des befinden (
?
Antworten:
Weil das kein ist
<
, ist es ein<()
völlig anderes. Dies wird als Prozessersetzung bezeichnet . Es ist eine Funktion bestimmter Shells, mit der Sie die Ausgabe eines Prozesses als Eingabe für einen anderen Prozess verwenden können.Die Operatoren
>
und<
leiten die Ausgabe in und die Eingabe aus Dateien um . Der<()
Bediener befasst sich mit Befehlen (Prozessen), nicht mit Dateien. Wenn du rennstSie versuchen, den Befehl
ls
in einer Subshell auszuführen (was die Klammern bedeuten) und diese Subshell dann als Eingabedatei an zu übergebensort
. Dies wird jedoch nicht akzeptiert und Sie erhalten den Fehler, den Sie gesehen haben.quelle
then sort is attempting to read the subshell as its input file
→ das ist offensichtlich falsch, da Bash die Syntax nicht einmal analysieren wird. Weder wirdls
nochsort
tatsächlich ausgeführt.< (ls)
ist hier kein gültiges Token.(ls)
laufenls
würde.Denn so soll es sein.
<(...)
inbash
ist die Syntax für die Prozessersetzung. Es wurde vom selben Operator in kopiertksh
.<
,(
,)
,|
,&
,;
Sind spezielle lexikalische Token inbash
denen verwendet werden , in verschiedenen Kombinationen spezielle Operatoren zu bilden.<
,<(
,<<
,<&
... haben jeweils ihre Rolle.<
ist für die Umleitung.<file
,< file
würde Eingaben aus einer Datei umleiten.<'(file)'
würde Eingaben aus einer aufgerufenen Datei umleiten(file)
, ist aber<(file)
ein anderer Operator, der kein Umleitungsoperator ist.< (file)
würde<
gefolgt von(file)
. In diesem Zusammenhang inbash
,(file)
ist nicht gültig.(...)
kann in einigen Kontexten als einzelnes Token gültig sein, z.Aber nicht in
In der
fish
Shell ist es anders. Infish
,(...)
ist für die Befehlssubstitutions (das Äquivalent von$(...)
inbash
). Und<
ist für die Eingabeumleitung wie in Bourne-ähnlichen Shells.Also in
fish
:wäre das gleiche wie:
Das ist:
Aber das ist etwas völlig anderes als
bash
die Prozessersetzung.In der
yash
Shell dient eine andere POSIX-Shell<(...)
nicht der Prozessersetzung, sondern der ProzessumleitungDa drin,
Kurz für:
ist ein Umleitungsoperator. Es ist mehr oder weniger gleichbedeutend mit:
Während Sie sich in befinden
bash
,<(ls -l)
wird der Pfad auf den Pfad einer Pipe erweitert.In
zsh
,(...)
ist als Globbing-Operator ((*.txt|*.png)
würde zutxt
undpng
Dateien erweitern) und als Glob-Qualifier (wird*(/)
zum Beispiel zu Verzeichnisdateien erweitert ) überladen .In
zsh
, in:Das
(ls -l)
würde als Glob Qualifier behandelt. Dasl
Glob-Qualifikationsmerkmal muss mit der Anzahl der Verknüpfungen übereinstimmen und erwartet eine Zahl danachl
(wie inls -ld ./*(l2)
der Liste der Dateien mit 2 Verknüpfungen). Daherzsh: number expected
wird dort eine Fehlermeldung angezeigt.sort < (w)
hättezsh: no matches found: (w)
stattdessen einen Fehler ausgegeben, da er(w)
mit den Dateien mit leerem Namen übereinstimmt, die beschreibbar sind.sort < (w|cat)
hätte den Inhalt derw
und / odercat
Dateien im aktuellen Verzeichnis sortiert ...quelle
sort < $(ls -l)
gibt diese Fehlermeldung:bash: $(ls -l): ambiguous redirect
$(ls -l)
sich um mehr als ein Wort handelt. Verwenden Sie Anführungszeichen, um split + glob (sort < "$(echo file)"
) zu verhindern . Beachten Sie, dass das Verhaltenbash
von POSIX sh in dieser Bash das split + glob auch dort ausführt, wenn es nicht interaktiv ist (nicht, wenn es so aufgerufen wirdsh
).ls -l | sort /dev/fd/0
ich mir das ansehe, kann ich sagen, dass die Ausgabe vonls -l
in gespeichert ist/dev/fd/0
und dersort
Befehl sie liest, um die gewünschte Ausgabe zu erhalten. Ich verwendetail -f --retry /dev/fd/0
, um diese Datei zu überwachen, aber ich erhalte keine Ausgabe. Warum? Wie kann ich diese Datei lesen?(foo | psub)
eine Substitution des Eingabeprozesses erzielen. Es gibt noch keinen Ersatz (ha) für die Substitution von Ausgabeprozessen.