Saya ingin tahu apakah ada cara untuk membuat 'file virtual' dari keluaran bash.
Contoh: Misalkan saya ingin mengirim email keluaran mysqldump
sebagai lampiran ke alamat email eksternal. Saya dapat menggunakan Mutt untuk melakukannya. The mutt
pilihan saya perlu digunakan adalah -a <name of the file I want to attach>
. Saya tahu saya bisa menggunakan file sementara:
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org
Tapi saya lebih suka mengarahkan mysqldump
output langsung ke Mutt saja. -a
Opsi Mutt hanya menerima file dan bukan stream, tapi mungkin ada cara untuk melewatinya semacam deskriptor file virtual atau semacamnya. Sesuatu seperti:
mutt -a $(mysqldump mysqldumpoptions) admin@example.org
Apa itu mungkin? Jika tidak, mengapa?
Ini mungkin contoh yang konyol dan pasti ada cara yang lebih mudah untuk melakukan ini, tapi saya harap ini menjelaskan pertanyaan saya tentang membuat file virtual dari output perintah lain.
sumber
Jawaban:
Ini adalah cara terbersih untuk melakukan apa yang Anda inginkan:
The
<()
operator adalah apa yang Anda minta; itu menciptakan FIFO (atau / dev / fd) dan melakukan fork proses dan menghubungkan stdout ke FIFO.>()
melakukan hal yang sama, kecuali menghubungkan stdin ke FIFO sebagai gantinya. Dengan kata lain, itu melakukan semua hal mknod untuk Anda di belakang layar; atau pada OS modern, apakah itu dengan cara yang bahkan lebih baik.Kecuali, tentu saja, itu tidak bekerja dengan mutt, katanya:
Saya menduga masalahnya adalah bahwa mutt sedang mencoba mencari dalam file, yang tidak dapat Anda lakukan pada pipa apa pun. Pencarian mungkin adalah sesuatu seperti memindai file untuk mencari tahu apa tipe MIME itu dan pengkodean apa yang mungkin bekerja (yaitu, apakah file tersebut 7bit atau 8bit), dan kemudian mencari ke awal file untuk benar-benar menyandikannya ke dalam pesan .
Jika yang ingin Anda kirim adalah teks biasa, Anda selalu dapat melakukan sesuatu seperti ini untuk menjadikannya isi utama email (bukan yang ideal, tetapi sebenarnya berfungsi):
sumber
Saya pikir apa yang Anda cari adalah penggunaan fifo
mknod
Catatan, proses penulisan akan terhambat jika tidak ada proses membaca.
misalnya
sumber
Apakah itu perlu lampiran? Jika itu dapat muncul sebagai badan pesan (7-bit clean ascii, tidak mengandung '.' Pada baris dengan sendirinya, dll.), Maka sesuatu seperti ini akan berfungsi:
sumber
Anda mungkin dapat menggunakan nama file
/dev/stdin
dengan mutt, yang akan dibaca dari stdin-nya.Hm, saya baru saja mencoba ini dan mutt mengeluh:
Baiklah. Saya pikir ini menjawab pertanyaan Anda, dengan
-a
opsi mutt mengharapkan file biasa, yang menyiratkan bukan perangkat atau pipa.sumber
FIFO mungkin merupakan cara terbaik. Namun Anda dapat menggunakannya
mkfifo /path/to/fifo
sebagai gantinyasumber
saya mungkin kehilangan sesuatu di sini, tetapi mengapa menggunakan mutt ketika ini terdengar lebih seperti pekerjaan untuk / usr / sbin / sendmail (atau di mana pun ia tinggal di distro Anda)?
mysqldump mysqldumpoptions | sendmail [email protected]
kebanyakan unix MTA menyediakan perintah / usr / sbin / sendmail, dan mereka semua memahami lebih banyak atau kurang opsi yang sama dan bekerja dengan cara yang kurang lebih sama. dalam hampir semua kasus, Anda tidak perlu peduli MTA / implementasi sendmail mana yang Anda gunakan.
ada beberapa alternatif lain juga, termasuk mail / mailx
sumber
Opsi Mutt -a secara khusus menggunakan tipe MIME yang didefinisikan di /etc/mime.types. Tidak ada tipe file virtual yang menurut Anda adalah tipe mime yang valid terdaftar, jadi saya tidak berpikir lampiran mutt akan berfungsi. Hanya untuk bukti konsep, Anda dapat mencoba menginstal paket dukungan mime (yang menyediakan biner akses file mime seperti lihat, edit, dll) dan jalankan lihat terhadap file virtual (katakanlah sebuah pipa), Anda akan melihat bahwa itu tidak tidak mengenalinya. Masalah mendasar adalah bahwa biasanya file virtual menyimpan konten data dalam memori, bukan pada disk, objek file hanyalah sebuah pointer. Anda bahkan dapat mencoba membungkus file virtual dengan tar / gz dan membuat mutt senang tapi saya ragu Anda akan mendapatkan sesuatu yang berguna dari ujung yang lain ... :)
sumber