Normalerweise müssen wir nur ein Argument übergeben:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Gibt es eine Möglichkeit, zwei Argumente zu übergeben? So etwas wie
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Ich könnte einfach beide Ergebnisse zuerst in einer Datei speichern
echo abc > file1
echo xyz > file2
cat file1 file2
Aber dann könnte ich versehentlich eine Datei überschreiben, was nicht in Ordnung ist. Dies geht in ein nicht interaktives Skript über. Grundsätzlich brauche ich eine Möglichkeit, die Ergebnisse von zwei beliebigen Befehlen an zu übergeben, cat
ohne in eine Datei zu schreiben.
UPDATE: Entschuldigung, das Beispiel maskiert das Problem. Während es zu { echo abc ; echo xyz ; } | cat
funktionieren scheint, liegt die Ausgabe am echo
s, nicht am cat
.
Ein besseres Beispiel wäre, { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
was nicht wie erwartet funktioniert.
Mit
file1:
a,b
c,d
file2:
1,2
3,4
Erwartete Ausgabe ist:
b,1
d,3
BEHOBEN:
Verwendung Prozess Substitution :cat <(command1) <(command2)
Alternativ können Sie Named Pipes erstellen, indem Sie Folgendes verwenden mkfifo
:
mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
Weniger elegant und ausführlicher, funktioniert aber gut, solange Sie sicherstellen, dass Temp1 und Temp2 nicht vor der Hand existieren.