Como substituir um nome de arquivo de saída por um comando personalizado que usa saída?

1

Digamos que eu tenha um comando cmd que está criando um novo nome de arquivo dado como argumento:

Por exemplo,

cmd -w /root/myfile

Como alterar essa expressão para usar um comando personalizado que use a saída do arquivo diretamente em vez de gravar o arquivo.

Eu não quero gravar o arquivo e, em seguida, disparar um comando nele, mas colocar a saída de cmd diretamente no novo comando personalizado.

Por exemplo, em vez de criar o arquivo e, em seguida, executar

 cat myfile | gpg -e > myfile.gpg

Estou procurando uma expressão que criptografe diretamente a saída.

A solução provavelmente está em usar um dispositivo de bloco como

(cmd -w /dev/device) & (dd if=/dev/device | gpg -e > myfile.gpg)

O Fifo nem sempre funciona.

    
por user624894 29.11.2016 / 12:02

3 respostas

4

O Bash permite usar a construção /dev/fd/ fd para se referir ao arquivo com o descritor de arquivo fd ; a entrada padrão é /dev/fd/0 , a saída padrão é /dev/fd/1 , etc., e é claro, você pode abrir outros descritores de arquivos.

Isso significa que se você tiver um comando cmdname que não pode gerar saída padrão, mas aceitar a opção -o nome do arquivo , poderá fazê-lo gravar na saída padrão com

cmdname -o /dev/fd/1
    
por AlexP 29.11.2016 / 12:51
0

gpg pode aceitar entrada e saída para fluxos ou arquivos. Se você puder usar o primeiro comando sem o sinalizador -w e evitar a necessidade de criar um arquivo, desde que seu comando esteja transmitindo para o stdout, você poderá usar:

cmd  | gpg -e -o /path/to/myfile.gpg

Que gravará diretamente suas informações criptografadas no arquivo, sem criar um arquivo intermediário.

    
por Arronical 29.11.2016 / 12:30
0

escreva uma função bash que aceita o nome do arquivo como argumento posicional . Dessa forma, seus 3 comandos se condensam em um.

encrypt(){
cmd -w ""
cat "" | gpg -e > "".gpg
}

Coloque isso em .bashrc, execute source ~/.bashrc e use como

encrypt myfile
    
por Sergiy Kolodyazhnyy 30.11.2016 / 00:03