bash 出力から「仮想ファイル」を作成する方法があるのだろうか。
mysqldump
例: の出力を添付ファイルとして外部のメール アドレスに送信したいとします。これを行うには、Mutt を使用します。mutt
使用するオプションは です-a <name of the file I want to attach>
。一時ファイルを使用できることはわかっています。
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile [email protected]
mysqldump
しかし、私はむしろ出力を Mutt に直接リダイレクトしたいと思います。Mutt の-a
オプションはファイルのみを受け入れ、ストリームは受け入れませんが、何らかの仮想ファイル記述子などを渡す方法があるかもしれません。次のようなものです:
mutt -a $(mysqldump mysqldumpoptions) [email protected]
それは可能ですか?不可能な場合は、なぜですか?
これはおそらくばかげた例であり、これを行うより簡単な方法が確かにあるでしょうが、別のコマンドの出力から仮想ファイルを作成するという私の質問を説明することができれば幸いです。
答え1
これは、あなたが望むことを行うための最もクリーンな方法です:
mutt [email protected] -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" [email protected]
答え2
あなたが探しているのは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
答え3
FIFOがおそらく最善の方法です。ただし、mkfifo /path/to/fifo
代わりに
答え4
/dev/stdin
ファイル名をmutt で使用して、stdin から読み取ることができる場合があります。
mysqldump mysqldumpoptions | mutt -a /dev/stdin [email protected]
うーん、これを試してみたところ、mutt が文句を言いました:
/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.
-a
まあ、いいでしょう。ただし、オプション mutt は通常のファイルを期待しており、デバイスやパイプではないことを意味するため、これで質問への回答になると思います。