„Virtuelle Datei“ aus der Ausgabe eines Bash-Befehls erstellen?

„Virtuelle Datei“ aus der Ausgabe eines Bash-Befehls erstellen?

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 mysqldumpals Anhang an eine externe E-Mail-Adresse senden. Dazu kann ich Mutt verwenden. Die muttOption, 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 mysqldumpAusgabe lieber direkt an Mutt umleiten. -aDie 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/fifostattdessen 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 -aOption „mutt erwartet eine reguläre Datei“, was kein Gerät oder Pipe impliziert.

verwandte Informationen