Me pregunto si hay una manera de crear un 'archivo virtual' a partir de una salida bash.
Ejemplo: supongamos que quiero enviar por correo electrónico la salida de mysqldump
un archivo adjunto a una dirección de correo electrónico externa. Puedo usar Mutt para hacerlo. La mutt
opción que necesito usar es -a <name of the file I want to attach>
. Sé que podría usar un archivo temporal:
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org
Pero prefiero redirigir la mysqldump
salida directamente a Mutt. La -a
opción de Mutt solo acepta un archivo y no una secuencia, pero tal vez haya una forma de pasarle algún tipo de descriptor de archivo virtual o algo por el estilo. Algo como:
mutt -a $(mysqldump mysqldumpoptions) admin@example.org
¿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.
fuente
Respuestas:
Esta es la forma más limpia de hacer lo que quieres:
El
<()
operador es lo que estabas pidiendo; crea un FIFO (o / dev / fd) y bifurca un proceso y conecta stdout al FIFO.>()
hace lo mismo, excepto que conecta stdin al FIFO en su lugar. En otras palabras, hace todo lo necesario para usted detrás de escena; o en un sistema operativo moderno, lo hace de una manera aún mejor.Excepto, por supuesto, que no funciona con mutt, dice:
Sospecho que el problema es que mutt está tratando de buscar en el archivo, lo que no se puede hacer en una tubería de ningún tipo. La búsqueda es probablemente algo así como escanear el archivo para descubrir qué tipo de MIME es y qué codificaciones podrían funcionar (es decir, si el archivo es de 7 bits u 8 bits), y luego buscar el comienzo del archivo para codificarlo realmente en el mensaje .
Si lo que desea enviar es texto sin formato, siempre puede hacer algo como esto para convertirlo en el contenido principal del correo electrónico (no es ideal, pero en realidad funciona):
fuente
Creo que lo que estás buscando es un quince usando
mknod
Tenga en cuenta que el proceso de escritura se bloqueará si no hay un proceso de lectura.
p.ej
fuente
¿Tiene que ser un archivo adjunto? Si puede aparecer como el cuerpo de un mensaje (ascii limpio de 7 bits, no contiene '.' En una línea por sí mismo, etc.), entonces algo como esto funcionaría:
fuente
Es posible que pueda usar el nombre de archivo
/dev/stdin
con mutt, que se leerá en su stdin.Hm, acabo de intentar esto y mutt se queja:
Oh bien. Sin embargo, creo que esto responde a su pregunta, con la
-a
opción mutt espera un archivo normal, lo que implica no un dispositivo o tubería.fuente
Un FIFO es probablemente la mejor manera. Sin embargo, puedes usar
mkfifo /path/to/fifo
en su lugarfuente
Puede que me falte algo aquí, pero ¿por qué usar mutt cuando esto suena más como un trabajo para / usr / sbin / sendmail (o donde sea que viva en su distribución)?
mysqldump mysqldumpoptions | sendmail [email protected]
La mayoría de los MTA de Unix proporcionan un comando / usr / sbin / sendmail, y todos entienden más o menos las mismas opciones y trabajan más o menos de la misma manera. en casi todos los casos, no necesita preocuparse qué MTA / implementación particular de sendmail está utilizando.
También hay varias otras alternativas, incluyendo mail / mailx
fuente
La opción Mutt -a utiliza específicamente los tipos MIME definidos en /etc/mime.types. Ninguno de los tipos de archivos virtuales que crees que es realmente un tipo mime válido registrado, por lo que no creo que el adjunto mutt funcione. Solo como prueba del concepto, puede intentar instalar el paquete mime-support (que proporciona binarios de acceso a archivos mime como see, edit, etc.) y ejecutar see contra un archivo virtual (digamos una tubería), verá que lo hace No lo reconozco. El problema fundamental es que normalmente un archivo virtual contiene contenido de datos en la memoria, no en el disco, el objeto del archivo es solo un puntero. Incluso puede intentar envolver un archivo virtual con tar / gz y hacer que mutt esté feliz, pero dudo que obtenga algo útil del otro extremo ... :)
fuente