¿Crear un 'archivo virtual' a partir de la salida del comando bash?

¿Crear un 'archivo virtual' a partir de la salida del comando bash?

Me pregunto si hay alguna manera de crear un 'archivo virtual' a partir de una salida de bash.

Ejemplo: digamos que quiero enviar por correo electrónico el resultado mysqldumpcomo un archivo adjunto a una dirección de correo electrónico externa. Puedo usar Mutt para hacerlo. La muttopción que necesito usar es -a <name of the file I want to attach>. Sé que me vendría bien un archivo temporal:

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile [email protected]

Pero prefiero redirigir la mysqldumpsalida directamente a Mutt. La opción de Mutt -asolo acepta un archivo y no una secuencia, pero tal vez haya una manera de pasarle algún tipo de descriptor de archivo virtual o algo por el estilo. Algo como:

mutt -a $(mysqldump mysqldumpoptions) [email protected]

¿Es posible? Si no, ¿por qué?

Este es quizás un ejemplo tonto y seguramente hay formas más fáciles de hacerlo, pero espero que explique mi pregunta sobre la creación de un archivo virtual a partir de la salida de otro comando.

Respuesta1

Esta es la forma más limpia de hacer lo que quieres:

mutt [email protected] -a <(mysqldump mysqldumpoptions)

El <()operador es lo que pedías; crea un FIFO (o /dev/fd) y bifurca un proceso y conecta la salida estándar al FIFO. >()hace lo mismo, excepto que, en su lugar, conecta la entrada estándar al FIFO. En otras palabras, hace todo el trabajo de mknod detrás de escena; o en un sistema operativo moderno, lo hace aún mejor.

Excepto, por supuesto, que eso no funciona con chucho, dice:

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

Sospecho que el problema es que mutt está intentando buscar en el archivo, lo que no se puede hacer en una tubería de ningún tipo. La búsqueda probablemente sea algo así como escanear el archivo para descubrir qué tipo MIME es y qué codificaciones podrían funcionar (es decir, si el archivo es de 7 bits u 8 bits), y luego buscar hasta el principio del archivo para codificarlo en el mensaje. .

Si lo que desea enviar es texto sin formato, siempre puede hacer algo como esto para que sea el contenido principal del correo electrónico (no es ideal, pero realmente funciona):

mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" [email protected]

Respuesta2

Creo que lo que estás buscando es un quince usandomknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

Tenga en cuenta que el proceso de escritura se bloqueará si no hay un proceso de lectura.

p.ej

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

Respuesta3

Un FIFO es probablemente la mejor manera. Sin embargo, puedes usar mkfifo /path/to/fifoen su lugar

Respuesta4

Es posible que pueda utilizar el nombre del archivo /dev/stdincon mutt, que se leerá desde su entrada estándar.

mysqldump mysqldumpoptions | mutt -a /dev/stdin [email protected]

Hm, acabo de intentar esto y chucho se queja:

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

Oh bien. Sin embargo, creo que esto responde a tu pregunta, con la -aopción mutt espera un archivo normal, lo que implica que no es un dispositivo o tubería.

información relacionada