Escribir la salida de múltiples comandos secuenciales en un archivo de texto

22

Intento verificar el último Firefox y quiero obtener todos los hashes en un archivo TXT.

Lo que intento hacer es:

sha1sum firefox.tar.gz > sha.txt

y lo intento también:

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

pero solo el último en este caso el sha512 se imprime en sha.txt.

¿Qué estoy haciendo mal? Por favor, ¿alguien puede ayudarme con esto?

XBMCuser
fuente

Respuestas:

31

Como otros ya han señalado la diferencia entre >(sobrescribir) y >>(agregar) operadores de redireccionamiento, voy a dar un par de soluciones.

  1. Puede usar la {}función de agrupación de comandos de bashpara enviar la salida de todos los comandos en un solo archivo:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Alternativamente, puede ejecutar los comandos en una subshell ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
heemayl
fuente
1
¿Qué solución se considera más genérica / portátil {}o ()? Gracias.
codeaviator
55
@codeaviator subnivel: ().
heemayl
5

Debe utilizar el redireccionador append en >>lugar de >los comandos posteriores, por ejemplo

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 la Appending Redirected Outputsección de la página de manual de bash ( man bash).

conductor de acero
fuente
1

El >redirector escribe la salida del comando ( stdoutno stderr, usted usa 2>para eso) en el archivo especificado después. Si ya existe, el archivo se sobrescribirá.

Este comportamiento es útil para el primero de sus comandos: si hay un archivo existente, debe eliminarse y reemplazarse por el nuevo.

Sin embargo, como necesita agregar todas las salidas adicionales en lugar de reemplazar las anteriores, debe usar el redireccionador de agregación >>. Esto creará un archivo si aún no existe, pero agrega la salida redirigida al archivo, si ya existe.


Y no utilice la tubería |para escribir varios comandos en una línea, lo que redirigiría la salida del primer comando ( stdout) a la entrada del segundo comando ( stdin).

Puede usar el punto y coma ( ;) para decirle a bash que ejecute un comando después del otro, como si fuera un archivo de script. Si un comando falla (el código de retorno no es 0), los comandos restantes aún se ejecutan.

O puede elegir los operadores lógicos AND ( &&) u OR ( ||):
si usa &&para conectar dos comandos, el segundo solo se ejecutará, si el primero tiene éxito (el código de retorno es 0). Si falla, ninguno de los siguientes comandos se ejecutará.
¡Sin ||embargo, solo ejecuta el segundo comando si falla el primero (el código de retorno no es 0)!

Entonces, en su caso, le recomendaría que use el punto y coma:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Byte Commander
fuente