Ich suche nach einer Alternative für den |
Operator in der Bash-Shell, um die Ausgabe des Befehls als Eingabe für den nächsten Befehl umzuleiten. Gibt es eine Alternative?
etwas wie :
command1 | command2 | command3
mit Alternative zu:
command1 X command2 X command3
X
wird anstelle von verwendet |
. Ist es möglich, die Verwendung zu vermeiden |
und durch den tatsächlichen Betreiber zu ersetzen?
|
.|
? Die zweite Frage ist snarky, aber welches Problem versuchen Sie zu lösen?tee
mit Prozesssubstitution könnte das sein, was Sie brauchen.Antworten:
Das Äquivalent von
command1 | command2
istcommand2 < <(command1)
Dies kann auch auf drei (oder mehr) Befehle erweitert werden.
command3 < <(command2 < <(command1))
Wie Oli vorschlug, ist dies zwar technisch gesehen die gleiche Leistung wie eine Pipe.
quelle
<(..)
verwandelt das STDOUT der internen Befehlsausgabe in einen Dateideskriptor (den der Befehlgrep
in Ihrem Beispiel öffnet). Wenn Sie eine Pipe ausführen, liest der Lesebefehl direkt aus STDIN (das mit STDOUT des Pipe-Befehls gefüllt wird). Subtile Unterschiede können jedoch bei Befehlen von Bedeutung sein, die nur STDIN lesen können.cmd2 < <(cmd1)
ist eher so.pipe(2)
undfork()
s unddup2()
s das Rohr zum Standard des einen Prozesses und zum Standard des anderen. Der Unterschied scheint darin zu liegen, dass das Programm in Klammern in einer Unterschale ausgeführt wird. Wenn Sie beispielsweise Strg-C drücken, wird das Programm in der Unterschale nicht unterbrochen und geht "verloren". Das fühlt sich für mich tatsächlich wie ein Fehler an.<
ist dies nicht eine Umleitung.<()
in einer Befehlszeile wird vollständig durch den Pfad zu einer Datei ersetzt, eine Datei, die zufällig die Standardausgabe des Befehls innerhalb der Prozessersetzung ist, aber dennoch ein Pfad. Ob Sie einen Pfad zu einer Datei angeben oder von (oder zu dieser, wenn>()
) umleiten möchten, ist eine separate Frage. Deshalb ist dieser Prozess Substitution und nicht die Prozess Umleitung - wie Kommandosubstitution wird die Sache mit etwas ersetzt, einen Dateinamen in ein und Ausgang in den anderen.