46 votes

Créer un 'fichier virtuel' à partir de la sortie d'une commande bash?

Je me demande s'il existe un moyen de créer un "fichier virtuel" à partir d'une sortie bash.

Exemple: Disons que je veux envoyer par email la sortie de mysqldump en pièce jointe à une adresse email externe. Je peux utiliser Mutt pour le faire. L'option mutt que je dois utiliser est -a . Je sais que je pourrais utiliser un fichier temporaire:

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

Mais je préférerais rediriger la sortie de mysqldump directement vers Mutt. L'option -a de Mutt n'accepte qu'un fichier et non un flux, mais peut-être qu'il y a un moyen de lui transmettre une sorte de descripteur de fichier virtuel ou quelque chose du genre. Quelque chose comme:

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

Est-ce possible? Si non, pourquoi?

C'est peut-être un exemple idiot et il y a sûrement des moyens plus simples de le faire, mais j'espère que cela explique ma question sur la création d'un fichier virtuel à partir de la sortie d'une autre commande.

76voto

freiheit Points 14144

C'est la manière la plus propre de faire ce que vous voulez:

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

L'opérateur <> est ce que vous demandiez; il crée un FIFO (ou /dev/fd) et fork un processus et connecte stdout au FIFO. <> fait la même chose, sauf qu'il connecte stdin au FIFO à la place. En d'autres termes, il fait tout le travail de mknod pour vous en arrière-plan; ou sur un système d'exploitation moderne, le fait de manière encore plus efficace.

Sauf, bien sûr, que cela ne fonctionne pas avec mutt, il affiche:

/dev/fd/63: impossible de joindre le fichier.

Je soupçonne que le problème est que mutt essaie de rechercher dans le fichier, ce que vous ne pouvez pas faire sur un tuyau de n'importe quel type. La recherche est probablement quelque chose comme analyser le fichier pour déterminer quel type MIME il est et quelles codages pourraient fonctionner (c'est-à-dire si le fichier est en 7 bits ou en 8 bits), puis rechercher le début du fichier pour réellement l'encoder dans le message.

Si ce que vous voulez envoyer est du texte brut, vous pouvez toujours faire quelque chose comme ceci pour en faire le contenu principal de l'e-mail à la place (pas idéal, mais ça fonctionne effectivement):

mysqldump mysqldumpoptions | mutt -s "Voici ce mysqldump" admin@example.org

4voto

s014gr0 Points 27

Je pense que ce que vous cherchez est un fifo en utilisant mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

Remarque, le processus d'écriture sera bloqué s'il n'y a pas de processus de lecture.

par exemple

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

2voto

mblsha Points 305

Une FIFO est probablement la meilleure solution. Cependant, vous pouvez utiliser mkfifo /chemin/vers/fifo à la place

1voto

pgs Points 3441

Est-ce que cela doit être une pièce jointe? Si cela peut apparaître comme le corps d'un message (ascii propre à 7 bits, ne contient pas de '.' sur une ligne par elle-même, etc.), alors quelque chose comme ceci fonctionnerait :

mysqldump mysqldumpoptions | mutt -s "sauvegarde mysql d'aujourd'hui" admin@example.org

1voto

graham.reeds Points 9363

Vous pouvez peut-être utiliser le nom de fichier /dev/stdin avec mutt, qui lira à partir de son stdin.

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

Hm, je viens d'essayer cela et mutt se plaint :

/dev/stdin n'est pas un fichier régulier.
/dev/stdin : impossible d'attacher le fichier.

Eh bien. Je pense que cela répond à votre question cependant, avec l'option -a mutt s'attend à un fichier régulier, ce qui n'implique pas un périphérique ou un pipe.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X