Scrivi l'output di più comandi sequenziali in un file di testo


22

Provo a controllare l'ultimo Firefox e voglio ottenere tutti gli hash in un file TXT.

Quello che cerco di fare è:

sha1sum firefox.tar.gz > sha.txt

e provo anche:

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

ma solo l'ultimo in questo caso lo sha512 viene stampato su sha.txt.

Che cosa sto facendo di sbagliato? Per favore qualcuno può aiutarmi con questo?

Risposte:


31

Come altri hanno già sottolineato la differenza tra >(sovrascrivere) e >>(aggiungere) gli operatori di reindirizzamento, fornirò un paio di soluzioni.

  1. È possibile utilizzare la {}funzione di raggruppamento dei comandi di bashper inviare l'output di tutti i comandi in un singolo file:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. In alternativa è possibile eseguire i comandi in una subshell ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt

1
Quale soluzione è considerata la più generica / portatile {}o ()? Grazie.
codeaviatore il

5
@codeaviator subshell: ().
heemayl

5

È necessario utilizzare il redirector append >>anziché >per i comandi successivi, ad es

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 

Vedi la Appending Redirected Outputsezione della pagina del manuale di bash ( man bash).


1

Il >redirector scrive l'output del comando ( stdout, non stderr- che usi 2>per quello) nel file specificato dopo di esso. Se esiste già, il file verrà sovrascritto.

Questo comportamento è utile per il primo dei tuoi comandi: se esiste un file esistente, dovrebbe essere eliminato e sostituito con quello nuovo.

Tuttavia, poiché è necessario aggiungere tutti gli altri output invece di sostituire quelli precedenti, è necessario utilizzare il redirector append >>. Questo creerà un file se non esiste ancora, ma aggiunge l'output reindirizzato al file, se esiste già.


E per favore non usare la pipe |per scrivere più comandi in una riga, che reindirizzerebbe l'output del primo comando ( stdout) all'input del secondo comando ( stdin).

Puoi usare il punto e virgola ( ;) per dire a bash di eseguire un comando dopo l'altro, come se fosse un file di script. Se un comando fallisce (il codice di ritorno non è 0), i comandi rimanenti vengono comunque eseguiti.

Oppure puoi scegliere gli operatori logici AND ( &&) o OR ( ||):
se usi &&per connettere due comandi, il secondo verrà eseguito solo se il primo ha esito positivo (il codice di ritorno è 0). Se fallisce, nessuno dei seguenti comandi verrà eseguito.
L' ||però solo corre il secondo comando se il primo non è riuscita (codice di ritorno non è 0)!

Quindi nel tuo caso ti consiglierei di usare il punto e virgola:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.