Grave a saída de vários comandos sequenciais em um arquivo de texto

7

Eu tento verificar o Firefox mais recente e quero obter todos os hashes em um arquivo TXT.

O que eu tento fazer é:

sha1sum firefox.tar.gz > sha.txt

e eu tento também:

md5sum firefox.tar.gz > sha.txt | sha1sum firefox.tar.gz > sha.txt | sha512sum firefox.tar.gz > sha.txt 

mas apenas o último, neste caso, o sha512 é impresso no sha.txt.

O que estou fazendo de errado? Por favor alguém pode me ajudar com isso?

    
por XBMCuser 16.08.2015 / 18:19

3 respostas

12

Como outros já apontaram a diferença entre os operadores de redirecionamento > (substituir) e >> (anexar), darei algumas soluções.

  1. Você pode usar o agrupamento de comandos {} feature de bash para enviar a saída de todos os comandos em um único arquivo:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
    
  2. Como alternativa, você pode executar os comandos em um subshell () :

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
    
por heemayl 16.08.2015 / 19:36
5

Você precisa usar o redirecionador de append >> em vez de > para os comandos subsequentes, por exemplo,

sha1sum zeromq-4.1.2.tar.gz > sha.txt
md5sum zeromq-4.1.2.tar.gz  >> sha.txt 
sha512sum zeromq-4.1.2.tar.gz >> sha.txt 

Veja a seção Appending Redirected Output da página de manual do bash ( man bash ).

    
por steeldriver 16.08.2015 / 18:31
1

O redirecionador > grava a saída do comando ( stdout , não stderr - você usa 2> para isso) no arquivo especificado após ele. Se já existir, o arquivo será sobrescrito.

Esse comportamento é útil para o primeiro dos seus comandos: se houver um arquivo existente, ele deverá ser excluído e substituído pelo novo.

No entanto, como você precisa anexar todas as saídas adicionais em vez de substituir as anteriores, é necessário usar o redirecionador de acréscimo >> . Isso criará um arquivo se ele ainda não existir, mas anexará a saída redirecionada ao arquivo, se já existir.

E, por favor, não use o pipe | para escrever vários comandos em uma linha, o que redirecionaria a saída do primeiro comando ( stdout ) para a entrada do segundo comando ( stdin ).

Você pode usar o ponto-e-vírgula ( ; ) para apenas informar o bash para executar um comando após o outro, como se fosse um arquivo de script. Se um comando falhar (o código de retorno não é 0), os comandos restantes ainda serão executados.

Ou você pode escolher os operadores lógicos AND ( && ) ou OR ( || ):
Se você usar && para conectar dois comandos, o segundo será somente executado, se o primeiro for bem-sucedido (código de retorno é 0). Se falhar, nenhum dos seguintes comandos será executado. O || , no entanto, somente executa o segundo comando se o primeiro falhar (o código de retorno não é 0)!

Então, no seu caso, eu recomendo que você use o ponto-e-vírgula:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
    
por Byte Commander 16.08.2015 / 19:02