Ich frage mich, ob es eine Möglichkeit gibt, aus einer Bash-Ausgabe eine „virtuelle Datei“ zu erstellen.
Beispiel: Angenommen, ich möchte die Ausgabe von mysqldump
als Anhang an eine externe E-Mail-Adresse senden. Dazu kann ich Mutt verwenden. Die mutt
Option, die ich verwenden muss, ist -a <name of the file I want to attach>
. Ich weiß, dass ich eine temporäre Datei verwenden könnte:
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile [email protected]
Aber ich würde die mysqldump
Ausgabe lieber direkt an Mutt umleiten. -a
Die Option von Mutt akzeptiert nur eine Datei und keinen Stream, aber vielleicht gibt es eine Möglichkeit, ihr eine Art virtuellen Dateideskriptor oder etwas in der Art zu übergeben. So etwas wie:
mutt -a $(mysqldump mysqldumpoptions) [email protected]
Ist das möglich? Wenn nicht, warum?
Dies ist vielleicht ein albernes Beispiel und es gibt sicherlich einfachere Möglichkeiten, dies zu tun, aber ich hoffe, es erklärt meine Frage zum Erstellen einer virtuellen Datei aus der Ausgabe eines anderen Befehls.
Antwort1
Dies ist die sauberste Möglichkeit, das Gewünschte zu erreichen:
mutt [email protected] -a <(mysqldump mysqldumpoptions)
Der <()
Operator ist das, wonach Sie gefragt haben; er erstellt ein FIFO (oder /dev/fd), verzweigt einen Prozess und verbindet stdout mit dem FIFO. >()
tut dasselbe, verbindet aber stattdessen stdin mit dem FIFO. Mit anderen Worten, er erledigt den ganzen mknod-Kram für Sie im Hintergrund; oder auf einem modernen Betriebssystem sogar noch besser.
Außer natürlich, dass das mit Mutt nicht funktioniert, da steht:
/dev/fd/63: unable to attach file.
Ich vermute, das Problem besteht darin, dass Mutt versucht, in der Datei zu suchen, was mit keiner Pipe möglich ist. Die Suche besteht wahrscheinlich darin, die Datei zu scannen, um herauszufinden, um welchen MIME-Typ es sich handelt und welche Kodierungen funktionieren könnten (d. h., ob die Datei 7-Bit oder 8-Bit ist), und dann zum Anfang der Datei zu suchen, um ihn tatsächlich in die Nachricht zu kodieren.
Wenn es sich bei dem, was Sie senden möchten, um einfachen Text handelt, können Sie Folgendes tun, um ihn stattdessen zum Hauptinhalt der E-Mail zu machen (nicht ideal, aber es funktioniert tatsächlich):
mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" [email protected]
Antwort2
Ich denke, was Sie suchen, ist ein FIFO mitmknod
mknod /tmp/foo p
echo hello > /tmp/foo &
cat /tmp/foo
Beachten Sie, dass der Schreibvorgang blockiert wird, wenn kein Lesevorgang stattfindet.
z.B
mknod /tmp/foo p
mysqldump mysqldumpoptions > /tmp/foo &
mutt -a /tmp/foo
Antwort3
Ein FIFO ist wahrscheinlich der beste Weg. Sie können jedoch mkfifo /path/to/fifo
stattdessen verwenden
Antwort4
Möglicherweise können Sie den Dateinamen mit Mutt verwenden /dev/stdin
, das von seiner Standardeingabe liest.
mysqldump mysqldumpoptions | mutt -a /dev/stdin [email protected]
Hm, ich habe das gerade probiert und Mutt beschwert sich:
/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.
Na ja. Ich denke jedoch, dass dies Ihre Frage beantwortet, mit der -a
Option „mutt erwartet eine reguläre Datei“, was kein Gerät oder Pipe impliziert.