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.

0voto

cas Points 6563

Je dois peut-être manquer quelque chose ici, mais pourquoi utiliser mutt quand cela semble plutôt être un travail pour /usr/sbin/sendmail (ou où qu'il se trouve sur votre distribution) ?

mysqldump mysqldumpoptions | sendmail admin@example.org

La plupart des MTA Unix fournissent une commande /usr/sbin/sendmail, et ils comprennent tous plus ou moins les mêmes options et fonctionnent plus ou moins de la même manière. Dans presque tous les cas, vous n'avez pas besoin de savoir quel MTA/implémentation de sendmail particulier vous utilisez.

Il existe aussi plusieurs autres alternatives, y compris mail/mailx

0voto

L'option -a de Mutt utilise spécifiquement les types MIME définis dans /etc/mime.types. Aucun des types de fichiers virtuels auxquels vous pensez n'est en réalité un type MIME valide enregistré, donc je ne pense pas que la pièce jointe de Mutt fonctionnerait. Juste pour la preuve du concept, vous pouvez essayer d'installer le package mime-support (qui fournit des binaires d'accès aux fichiers mime tels que voir, éditer, etc.) et exécutez voir contre un fichier virtuel (disons un tuyau), vous verrez qu'il ne le reconnaît pas. Le problème fondamental est que normalement un fichier virtuel contient des données en mémoire, pas sur le disque, l'objet fichier n'est qu'un pointeur. Vous pouvez même essayer d'envelopper un fichier virtuel avec tar/gz et rendre Mutt heureux mais je doute que vous obteniez quelque chose d'utile de l'autre côté... :)

-1voto

ThorSummoner Points 311

Je espérais une option bash-native plus directe. J'ai fini par quelque chose comme

#!/bin/bash
badly-made-program \
    -multiline-literal "$(cat <<-EOF
        magic
        text
        here
EOF
)"

edit plus tard, j'ai réalisé que les littéraux bash pouvaient être rompus sur plusieurs lignes et échappés correctement de toute façon, cela signifie renoncer à supprimer le décalage par le bloc <<-EOT, mais le déplacer en dehors du site d'appel vers une variable était probablement bon pour moi aujourd'hui

multiline_literal="
magic
text
here
"
badly-made-program \
    -multiline-literal "${multiline_literal}"

Si vous connaissez une meilleure solution, comment me débarrasser de : en utilisant cat pour rediriger un bash heredoc de stdin vers une chaîne littérale"

edit2: je cherchais presque l'inverse exact de l'objectif de la question, je ne sais pas comment google m'a conduit ici, laissé pour la postérité ou d'autres googler's

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