criar 'arquivo virtual' a partir da saída do comando bash?

criar 'arquivo virtual' a partir da saída do comando bash?

Gostaria de saber se existe uma maneira de criar um 'arquivo virtual' a partir de uma saída do bash.

Exemplo: digamos que eu queira enviar por e-mail a saída de mysqldumpum anexo para um endereço de e-mail externo. Posso usar o Mutt para fazer isso. A muttopção que preciso usar é -a <name of the file I want to attach>. Eu sei que poderia usar um arquivo temporário:

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

Mas prefiro redirecionar a mysqldumpsaída diretamente para o Mutt. A opção do Mutt -aaceita apenas um arquivo e não um fluxo, mas talvez haja uma maneira de passar algum tipo de descritor de arquivo virtual ou algo nesse sentido. Algo como:

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

É possível? Se não, por quê?

Este talvez seja um exemplo bobo e certamente existem maneiras mais fáceis de fazer isso, mas espero que explique minha pergunta sobre a criação de um arquivo virtual a partir da saída de outro comando.

Responder1

Esta é a maneira mais limpa de fazer o que você deseja:

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

A <()operadora é o que você estava pedindo; ele cria um FIFO (ou /dev/fd) e bifurca um processo e conecta stdout ao FIFO. >()faz o mesmo, exceto que conecta stdin ao FIFO. Em outras palavras, ele faz todo o trabalho do mknod para você nos bastidores; ou em um sistema operacional moderno, faz isso de uma maneira ainda melhor.

Exceto, é claro, que isso não funciona com vira-lata, diz:

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

Eu suspeito que o problema é que o vira-lata está tentando procurar no arquivo, o que você não pode fazer em nenhum tipo de cano. A busca é provavelmente algo como escanear o arquivo para descobrir qual é o tipo MIME e quais codificações podem funcionar (ou seja, se o arquivo é de 7 ou 8 bits) e, em seguida, procurar o início do arquivo para realmente codificá-lo na mensagem .

Se o que você deseja enviar for texto simples, você sempre pode fazer algo assim para torná-lo o conteúdo principal do e-mail (não é o ideal, mas realmente funciona):

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

Responder2

Acho que o que você está procurando é um fifo usandomknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

Observe que o processo de escrita será bloqueado se não houver processo de leitura.

por exemplo

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

Responder3

Um FIFO é provavelmente a melhor maneira. No entanto, você pode usar mkfifo /path/to/fifoem vez disso

Responder4

Você pode usar o nome do arquivo /dev/stdincom mutt, que será lido em seu stdin.

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

Hm, acabei de tentar isso e o vira-lata reclama:

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

Ah bem. Acho que isso responde à sua pergunta, com a -aopção mutt espera um arquivo normal, o que implica não um dispositivo ou canal.

informação relacionada