bashコマンド出力から「仮想ファイル」を作成しますか?


36

bashの出力から「仮想ファイル」を作成する方法があるのだろうか。

例:の出力をmysqldump外部の電子メールアドレスへの添付ファイルとして電子メールで送信するとします。Muttを使用してそうすることができます。mutt私が使用する必要があるオプションがあります-a <name of the file I want to attach>。私は一時ファイルを使用できることを知っています:

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org

ただし、mysqldump代わりに出力をMuttに直接リダイレクトします。Muttの-aオプションはファイルのみを受け入れ、ストリームは受け入れませんが、ある種の仮想ファイル記述子またはそれらの行に沿って何かを渡す方法があるかもしれません。何かのようなもの:

mutt -a $(mysqldump mysqldumpoptions) admin@example.org

出来ますか?そうでない場合、なぜですか?

これはおそらくばかげた例であり、これを行う簡単な方法は確かにありますが、別のコマンドの出力から仮想ファイルを作成することについての私の質問を説明してくれることを願っています。


1
bashの代わりにshを使用していることに気付くまで、<()を動作させることができませんでした。うまく機能しています。(必要な場合)必要最低限​​の評判に達した場合、有益な回答に賛成します。回答ありがとうございます。
ピエール

回答:


53

これはあなたがしたいことをする最もきれいな方法です:

mutt admin@example.org -a <(mysqldump mysqldumpoptions)

<()オペレータは、あなたが求めていたものです。FIFO(または/ dev / fd)を作成してプロセスを分岐し、stdoutをFIFOに接続します。 >()同じことを行いますが、代わりにstdinをFIFOに接続します。つまり、舞台裏ですべてのmknodの処理を行います。または最新のOSでは、さらに良い方法でそれを行います。

もちろん、それがmuttでは機能しないことを除いて、次のように述べています。

/dev/fd/63: unable to attach file.

問題はmuttがファイル内でシークしようとしていることだと思いますが、これはどんなパイプでも実行できません。シークはおそらく、ファイルをスキャンしてどのMIMEタイプで、どのエンコードが機能するか(つまり、ファイルが7ビットか8ビットか)を把握し、ファイルの先頭までシークして実際にメッセージにエンコードするようなものです。 。

送信したいものがプレーンテキストの場合、常に次のようなことをして、代わりにメールのメインコンテンツにすることができます(理想的ではありませんが、実際に機能します):

mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" admin@example.org

2
驚くばかり!このようなリダイレクトは初めて見ました。
Saurabhバルジャティヤ2009

良い説明をありがとう!I / Oリダイレクトのチュートリアルで、これを見たことはありません。
クリスチャンマン

4

あなたが探しているのはFIFOを使用していると思います mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

読み取りプロセスがない場合、書き込みプロセスはブロックされます。

例えば

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

1

添付ファイルにする必要がありますか?メッセージの本文として表示できる場合(7ビットのクリーンアスキー、行に「。」が含まれていないなど)、次のように機能します。

mysqldump mysqldumpoptions | mutt -s "今日のmysqlダンプ" admin@example.org


1

/dev/stdinmuttでファイル名を使用すると、stdinから読み取ることができる場合があります。

mysqldump mysqldumpoptions | mutt -a /dev/stdin admin@example.org

うーん、私はこれを試してみましたが、ムットは不平を言っています

/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.

しかたがない。-aオプションのmuttは通常のファイルを想定しているため、デバイスやパイプではないことを意味するので、これはあなたの質問に答えると思います。


1

FIFOがおそらく最良の方法です。ただし、mkfifo /path/to/fifo代わりに使用できます


0

私はここで何かを見逃しているかもしれませんが、これが/ usr / sbin / sendmailの仕事のように聞こえるとき(またはあなたのディストリビューションのどこにでも)muttを使用するのはなぜですか?

mysqldump mysqldumpoptions | sendmail admin@example.org

ほとんどのUNIX MTAは/ usr / sbin / sendmailコマンドを提供し、それらはすべてほぼ同じオプションを理解し、ほぼ同じ方法で動作します。ほとんどすべての場合、使用している特定のMTA / sendmailの実装を気にする必要はありません。

mail / mailxなど、他にもいくつかの選択肢があります


1
それは添付ファイルではなく、受信者にとっては使いにくいと思われる
freiheit 2009

1
その場合、より良い解決策は、metamail(1)やmime-construct(1p)などのツールを使用するか、perl MIME :: Liteモジュールのようなものを使用して独自のコードを作成することです最も一般的なMIME関連のもの)。
cas

0

Mutt -aオプションは、特に/etc/mime.typesで定義されたMIMEタイプを使用します。実際に登録されている有効なMIMEタイプではないと思われる仮想ファイルタイプはないため、mutt添付ファイルは機能しないと思います。概念の証拠として、mime-supportパッケージ(see、editなどのmimeファイルアクセスバイナリを提供)をインストールして、仮想ファイル(see pipe)に対してseeを実行してみてください。それを認識しません。基本的な問題は、通常、仮想ファイルがディスクではなくメモリにデータコンテンツを保持していることです。ファイルオブジェクトは単なるポインタです。仮想ファイルをtar / gzでラップしてmuttを幸せにすることもできますが、もう一方の端から何か役に立つものが得られるとは思いません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.