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