Grava a saída de vários comandos seqüenciais em um arquivo de texto

22

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 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 nesse caso, o sha512 é impresso no sha.txt.

O que estou fazendo errado? Por favor, alguém lá fora pode me ajudar com isso?

XBMCuser
fonte

Respostas:

31

Como outros já apontaram a diferença entre >(substituir) e >>(acrescentar) operadores de redirecionamento, vou dar algumas soluções.

  1. Você pode usar o {}recurso de agrupamento de comandos de bashpara 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
heemail
fonte
11
Qual solução é considerada a mais genérica / portátil {}ou ()? Obrigado.
Codemiator
5
@codeaviator subnível: ().
heemayl
5

Você precisa usar o redirecionador de acréscimo em >>vez dos >comandos subseqüentes, 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 

Consulte a Appending Redirected Outputseção da página do manual do bash ( man bash).

chave de aço
fonte
1

O >redirecionador grava a saída do comando ( stdoutnão stderr- você usa 2>para isso) no arquivo especificado depois dele. Se já existir, o arquivo será substituído.

Esse comportamento é útil para o primeiro de 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 anexação >>. Isso criará um arquivo se ele ainda não existir, mas anexará a saída redirecionada ao arquivo, se ele já existir.


E não use o canal |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 dizer ao 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á executado, se o primeiro for bem-sucedido (o código de retorno é 0). Se falhar, nenhum dos seguintes comandos será executado.
O ||entretanto única corre o segundo comando se o primeiro falhou (código de retorno não é 0)!

Portanto, 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 
Byte Commander
fonte