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 mysqldump
um anexo para um endereço de e-mail externo. Posso usar o Mutt para fazer isso. A mutt
opçã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 mysqldump
saída diretamente para o Mutt. A opção do Mutt -a
aceita 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/fifo
em vez disso
Responder4
Você pode usar o nome do arquivo /dev/stdin
com 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 -a
opção mutt espera um arquivo normal, o que implica não um dispositivo ou canal.