creare 'file virtuale' dall'output del comando bash?


36

Mi chiedo se esiste un modo per creare un "file virtuale" da un output bash.

Esempio: supponiamo di voler inviare l'output di mysqldumpcome allegato a un indirizzo di posta elettronica esterno. Posso usare Mutt per farlo. L' muttopzione che devo usare è -a <name of the file I want to attach>. So che potrei usare un file temporaneo:

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

Preferirei invece reindirizzare l' mysqldumpoutput direttamente a Mutt. L' -aopzione di Mutt accetta solo un file e non uno stream, ma forse esiste un modo per passarlo a una sorta di descrittore di file virtuale o qualcosa del genere. Qualcosa di simile a:

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

È possibile? Se no, perché?

Questo è forse un esempio sciocco e sicuramente ci sono modi più semplici per farlo, ma spero che spieghi la mia domanda sulla creazione di un file virtuale dall'output di un altro comando.


1
Non sono riuscito a far funzionare <() finché non mi sono reso conto che stavo usando sh invece di bash. Funziona benissimo. Valuterò le risposte utili quando (se) raggiungerò la reputazione minima necessaria. Grazie per tutte le risposte.
Pierre,

Risposte:


53

Questo è il modo più pulito per fare quello che vuoi:

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

L' <()operatore è quello che stavi chiedendo; crea un FIFO (o / dev / fd) e crea un processo e collega stdout al FIFO. >()fa lo stesso, tranne collega invece lo stdin al FIFO. In altre parole, fa tutte le cose di mknod per te dietro le quinte; o su un sistema operativo moderno, lo fa in un modo ancora migliore.

Tranne, ovviamente, che non funziona con Mutt, dice:

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

Sospetto che il problema sia che mutt sta cercando di cercare nel file, cosa che non si può fare su una pipe di alcun tipo. La ricerca è probabilmente qualcosa di simile alla scansione del file per capire di che tipo MIME è e quali codifiche potrebbe funzionare (ovvero, se il file è 7 bit o 8 bit), e quindi cercare l'inizio del file per codificarlo effettivamente nel messaggio .

Se quello che vuoi inviare è un testo semplice, puoi sempre fare qualcosa del genere per renderlo il contenuto principale dell'e-mail (non l'ideale, ma in realtà funziona):

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

2
Eccezionale! Vedo questo reindirizzamento per la prima volta.
Saurabh Barjatiya,

Grazie per la buona spiegazione! Non l'ho mai visto prima, in nessun tutorial sul reindirizzamento I / O.
Christian Mann,

4

Penso che quello che stai cercando sia un Fifo usando mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

Nota, il processo di scrittura si bloccherà se non c'è processo di lettura.

per esempio

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

1

Deve essere un allegato? Se può apparire come il corpo di un messaggio (ascii pulito a 7 bit, non contiene '.' Su una riga da solo, ecc.), Allora qualcosa del genere funzionerebbe:

mysqldump mysqldumpoptions | mutt -s "discarica mysql di oggi" admin@example.org


1

Potresti essere in grado di usare il nome file /dev/stdincon mutt, che leggerà dal suo stdin.

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

Hm, ho appena provato questo e mutt si lamenta:

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

Oh bene. Penso che questo risponda alla tua domanda, tuttavia, con l' -aopzione mutt si aspetta un file normale, che non implica un dispositivo o una pipe.


1

Un FIFO è probabilmente il modo migliore. Tuttavia puoi usare mkfifo /path/to/fifoinvece


0

potrei mancare qualcosa qui, ma perché usare mutt quando sembra più un lavoro per / usr / sbin / sendmail (o ovunque si trovi sulla tua distribuzione)?

mysqldump mysqldumpoptions | sendmail admin@example.org

la maggior parte degli MTA unix fornisce un comando / usr / sbin / sendmail e tutti comprendono più o meno le stesse opzioni e funzionano più o meno allo stesso modo. in quasi tutti i casi, non devi preoccuparti di quale particolare MTA / implementazione di sendmail stai usando.

ci sono anche molte altre alternative, tra cui mail / mailx


1
quindi non è un allegato, che sembra essere più difficile da usare per il destinatario
freiheit

1
in quel caso, una soluzione migliore sarebbe quella di usare uno strumento come metamail (1) o mime-construct (1p) o scrivere il tuo usando qualcosa come il modulo perime MIME :: Lite (il mio preferito perché facilita le operazioni le cose più comuni relative al mimo).
Cas

0

L'opzione Mutt -a utilizza specificamente i tipi MIME definiti in /etc/mime.types. Nessuno dei tipi di file virtuali che potresti pensare siano effettivamente registrati con un tipo MIME valido, quindi non credo che l'allegato mutt funzionerebbe. Solo per la prova del concetto, puoi provare a installare il pacchetto mime-support (che fornisce i binari di accesso ai file mime come vedi, modifica, ecc.) Ed esegui vedere su un file virtuale (diciamo una pipe), vedrai che lo fa non riconoscerlo. Il problema fondamentale è che normalmente un file virtuale contiene contenuto di dati in memoria, non su disco, l'oggetto file è solo un puntatore. Puoi anche provare a avvolgere un file virtuale con tar / gz e rendere felice mutt ma dubito che otterrai qualcosa di utile dall'altra parte ... :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.