Einige Shells bash
unterstützen beispielsweise Process Substitution, mit der die Prozessausgabe als Datei dargestellt werden kann:
$ diff <(sort file1) <(sort file2)
Dieses Konstrukt ist jedoch nicht POSIX und daher nicht portierbar. Wie kann eine POSIX- freundliche Prozesssubstitution erreicht werden (dh eine, die funktioniert /bin/sh
) ?
Anmerkung: die Frage ist nicht , zu fragen , wie man diff zwei sortierten Dateien - , die nur ein konstruiertes Beispiel soll zeigen , Prozess Substitution !
shell
pipe
posix
process-substitution
starfry
quelle
quelle
/bin/sh
POSIX-Shell sein, sondern es musssh
irgendwo ein Befehl aufgerufen werden, der in der richtigen Umgebung POSIX-kompatibel ist. Unter Solaris 10/bin/sh
handelt es sich beispielsweise nicht um eine POSIX-Shell, sondern um eine alte Bourne-Shell, in der sich die POSIX-Shell befindet/usr/xpg4/bin/sh
.Antworten:
Diese Funktion wurde von
ksh
(erstmals in ksh86 dokumentiert) eingeführt und nutzte die/dev/fd/n
Funktion (in einigen BSDs und AT & T-Systemen zuvor unabhängig hinzugefügt). Inksh
und bis ksh93u würde es nicht funktionieren, wenn Ihr System nicht die Unterstützung für / dev / fd / n hätte. Ab zsh, bash undksh93u+
höher können temporäre Named Pipes (Named Pipes, die meiner Meinung nach in SysIII hinzugefügt wurden) verwendet werden, bei denen / dev / fd / n nicht verfügbar ist.Auf Systemen, auf denen verfügbar ist (POSIX gibt diese nicht an), können Sie die Substitution selbst durchführen ( ) mit:
/dev/fd/n
diff <(cmd1) <(cmd2)
Unter
ksh93
Linux funktioniert dies jedoch nicht , da Shell-Pipes mit Socket-Paaren anstelle von Pipes implementiert werden und das Öffnen,/dev/fd/3
bei dem fd 3 auf einen Socket zeigt, unter Linux nicht funktioniert.Obwohl POSIX nicht spezifiziert . Es werden Named Pipes angegeben. Named Pipes funktionieren wie normale Pipes, nur dass Sie über das Dateisystem darauf zugreifen können. Das Problem hierbei ist, dass Sie temporäre Dateien erstellen und diese anschließend bereinigen müssen. Dies ist schwierig, da POSIX über keinen Standardmechanismus (wie er auf einigen Systemen zu finden ist) verfügt, um temporäre Dateien oder Verzeichnisse zu erstellen und die Signalverarbeitung portabel durchzuführen (beim Auflegen oder Töten aufzuräumen) ist auch schwer tragbar zu machen.
/dev/fd/n
mktemp -d
Sie könnten etwas tun wie:
(kümmert sich hier nicht um die Signalverarbeitung).
quelle
/dev/fd/n
Beispiel nicht herausfinden . Warum wird Deskriptor 4 zweimal geschlossen? (Und so ist Deskriptor 3.) Ich bin verloren.cmd2
(dup2(0,4)
auf der Außenseite{...}
, restauriert mitdup2(4,0)
für das Innere{...}
).mktemp -d
dazu beitragen, sicherzustellen, dass Sie FIFOs erhalten, da niemand in Ihr brandneues zufälliges temporäres Verzeichnis schreiben sollte.mktemp -d
. Dies ist jedoch kein Standard- / POSIX-Befehl.Falls erforderlich, um den Verlust von Variablen im Nutzwert zu vermeiden
cmd | while read A B C
, anstelle von:Sie können verwenden:
Um die Frage zu beantworten:
quelle