bash komut çıktısından 'sanal dosya' oluştur?


36

Bir bash çıktısından 'sanal dosya' yaratmanın bir yolu olup olmadığını merak ediyorum.

Örnek: mysqldumpDış e-posta adresine ek olarak çıktı olarak e-posta göndermek istediğimi varsayalım . Bunu yapmak için Mutt'ı kullanabilirim. muttBen kullanımına gerek seçenektir -a <name of the file I want to attach>. Geçici bir dosya kullanabileceğimi biliyorum:

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

Ancak mysqldumpçıktıyı doğrudan Mutt'a yönlendirmeyi tercih ederim . Mutt'ın -aseçeneği yalnızca bir dosyayı kabul eder, bir akışı değil, belki de bir tür sanal dosya tanımlayıcısını veya bu satırlar boyunca bir şeyi iletmenin bir yolu olabilir. Gibi bir şey:

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

Mümkün mü? Değilse neden?

Bu belki saçma bir örnek ve kesinlikle bunu yapmanın daha kolay yolları var, ancak umarım başka bir komutun çıktısından sanal bir dosya oluşturma hakkındaki sorumu açıklar.


1
Bash yerine sh kullandığımı fark edene kadar <() çalışamadım. Harika çalışıyor. Gerekli asgari itibara (eğer) ulaşırsam, yararlı cevapları iptal edeceğim. Tüm cevaplar için teşekkürler.
Pierre,

Yanıtlar:


53

İstediğini yapmanın en temiz yolu bu:

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

<()Operatör istediğinin ne olduğu; bir FIFO (veya / dev / fd) yaratır ve bir süreci yönetir ve stdout'u FIFO'ya bağlar. >()aynısını yapar, bunun yerine stdin'i FIFO'ya bağlar hariç. Başka bir deyişle, sahne arkasında sizin için tüm mknod şeylerini yapar; veya modern bir işletim sistemi üzerinde, daha iyi bir şekilde yapar.

Tabii ki, bu mutt ile çalışmıyor, diyor ki:

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

Sorunun asıl sorunun bir borunun üzerinde yapamayacağın dosyada aramaya çalıştığından şüpheliyim. Arama, muhtemelen hangi MIME tipinin olduğunu ve hangi kodlamaların çalışabileceğini (yani, dosyanın 7bit mi yoksa 8bit mi olduğunu) bulmak için bir dosyayı taramak ve ardından mesajın şifresini kodlamak için dosyanın başlangıcını aramak gibi bir şeydir. .

Göndermek istediğiniz düz metinse, e-postanın ana içeriği yapmak için her zaman böyle bir şey yapabilirsiniz (ideal değil, ancak gerçekten çalışır):

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

2
Müthiş! İlk defa böyle bir yönlendirme görüyorum.
Saurabh Barjatiya

İyi bir açıklama için teşekkür ederim! Bunu daha önce, G / Ç yönlendirmesi ile ilgili herhangi bir rehberde görmedim.
Christian Mann,

4

Bence aradığın şey bir işte mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

Not, okuma işlemi yoksa yazma işleminin engelleneceğini unutmayın.

Örneğin

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

1

Ek olmak zorunda mı? Bir mesajın gövdesi olarak görünebilirse (7-bit temiz ascii, tek başına bir satırda '.

mysqldump mysqldumpoptions | mutt -s "bugünün mysql dökümü" admin@example.org


1

Dosya /dev/stdinadını, stdin dosyasından okuyacak olan mutt ile kullanabilirsiniz .

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

Hm, az önce bunu denedim ve saçma şikayet ediyor:

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

Oh iyi. Bence bu soruyu cevaplıyor, ancak -amutt seçeneği ile normal bir dosya beklemiyor, bu da cihaz veya boru değil.


1

Bir FIFO muhtemelen en iyi yoldur. Ancak mkfifo /path/to/fifobunun yerine kullanabilirsiniz


0

Burada bir şeyleri özlüyorum, ama bu neden / usr / sbin / sendmail (ya da dağıtımında nerede yaşıyorsa) için bir iş gibi göründüğünde neden mutt kullanıyorsun?

mysqldump mysqldumpoptions | sendmail admin@example.org

unix MTA'ların çoğu / usr / sbin / sendmail komutunu sağlar ve hepsi aynı seçenekleri az çok anlar ve aynı şekilde çalışırlar. Neredeyse her durumda, hangi belirli bir MTA / sendmail uygulamasını kullandığınıza dikkat etmeniz gerekmez.

mail / mailx dahil diğer birçok alternatif var


1
o zaman bu bir ek değil, alıcı için kullanımı daha zor gibi görünüyor
freiheit

1
Bu durumda, metamail (1) veya mime-construct (1p) gibi bir araç kullanmak veya perl MIME :: Lite modülü gibi kişisel bir şeyler kullanarak kendinize yazmak daha iyi bir çözüm olabilir. Mime ile ilgili en yaygın şeyler.
cas

0

Mutt -a seçeneği özellikle /etc/mime.types dosyasında tanımlanan MIME türlerini kullanır. Gerçekten düşüneceğiniz sanal dosya türlerinin hiçbiri kayıtlı bir mime türü değil, bu yüzden mutt ekinin işe yarayacağını sanmıyorum. Sadece konseptin kanıtı için, mime-destek paketini (mime dosyası erişim ikili dosyaları gibi (bakınız, düzenle, vb) sağlar) kurmayı deneyebilir ve sanal bir dosyaya karşı çalıştırmayı (pipo) söyleyebilirsiniz. tanımadım. Temel sorun, normalde sanal bir dosyanın veri içeriğini diskte değil bellekte tutmasıdır, dosya nesnesi sadece bir işaretçidir. Hatta tar / gz ile sanal bir dosya silmeyi deneyebilir ve muttunuzu mutlu edebilirsiniz, ancak diğer ucundan yararlı bir şey alacağınızdan şüpheliyim ... :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.