Posso passar arquivos entre comandos?

2

Eu estou procurando uma maneira de enviar o arquivo resultante de um comando para outro, então eu não tenho que salvar uma cópia no disco no meio. Por exemplo, se eu tiver rar ed arquivos no disco e quiser abri-los, gostaria de poder executar algo como:

unrar x file.rar | kplayer

unrar x file.rar | gpg -c

gpg file.gpg | kplayer 

Tenho certeza que você vê o que estou procurando. Eu tentei enviar unrar para a saída padrão com -p , mas ele apenas enviaria para a tela mesmo quando eu acho que deveria estar conectado com um | para o kplayer. Eu suponho que isso é porque o kplayer não pode obter seus dados de stdin.

Mas existe uma maneira de passar arquivos sem salvá-los no disco? É o melhor que consigo criar um sistema de arquivos na memória e usá-lo, mas não gosto da idéia de reservar muita memória.

    
por Dan 15.10.2011 / 16:06

4 respostas

2

Muitos comandos têm a opção de gravar em STDOUT . O Unrar, por exemplo, possui a opção p . Muitos comandos têm a opção - que pode ser usada em cojunção para ler STDIN . Então, o primeiro exemplo que você deu pode ser reescrito assim:

unrar px file.rar | kplayer -

GPG já funciona com entrada canalizada por padrão:

unrar px file.rar | gpg -c

Verifique a ajuda de um comando e / ou a página man / info se o envio dos resultados para STDOUT for suportado (muitos comandos fazem isso por padrão).

    
por 15.10.2011 / 19:00
2

Se o comando exigir apenas um nome de arquivo, especifique /dev/stdin ou /dev/fd/0 . Esses são arquivos especiais; abri-los realmente duplica a entrada padrão. Alguns comandos aceitam - como um alias para entrada padrão também.

unrar p foo.rar somefile | somecommand -
unrar p foo.rar somefile | somecommand /dev/stdin

Ocasionalmente, um programa impõe restrições ao nome do arquivo, geralmente exigindo uma extensão específica. Você pode ser capaz de enganá-lo com um link simbólico.

ln -s /dev/stdin myfile.ext
unrar p foo.rar somefile | somecommand myfile.ext

Isso nem sempre funciona, porque alguns programas não conseguem lidar com a entrada canalizada: eles exigem arquivos procuráveis, ou seja, arquivos onde eles podem ir e voltar à vontade. Nesse caso, você precisa criar um arquivo temporário.

Em alguns casos, você pode organizar os dados para que apareçam como um arquivo regular e não como a saída de um comando. O FUSE , em particular, pode fazer todos os tipos de coisas aparecerem como arquivos regulares. Por exemplo, com o AVFS , os membros do arquivo aparecem como arquivos.

mountavfs
cd "~/.avfs$PWD/foo.rar\#"
somecommand somefile
    
por 16.10.2011 / 00:57
1

Se você tem um shell compatível com substituição de processos , isso pode ajudar nos programas que não pode pegar dados de stdin.

Você faria kplayer <(unrar p file.rar)

Se você estiver desesperado, use um disco virtual e crie arquivos, mas eles ganharam. estar no disco.

    
por 15.10.2011 / 16:59
0

E obrigado a todos pela entrada, suponho que não há nenhuma maneira fácil de conseguir o que eu quero; (

O seguinte comando deve fazer e usar o / dev / shm, então eu preciso construir um script bacana:)

cp file.gpg /dev/shm && gpg -c file.gpg && rm file.gpg && kplayer file && rm file
    
por 16.10.2011 / 21:45