Schreiben Sie die Ausgabe mehrerer aufeinanderfolgender Befehle in eine Textdatei

22

Ich versuche, den neuesten Firefox zu überprüfen und möchte alle Hashes in einer TXT-Datei erhalten.

Was ich versuche zu tun, ist:

sha1sum firefox.tar.gz > sha.txt

und ich versuche auch:

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

In diesem Fall wird jedoch nur der letzte sha512 in der sha.txt ausgegeben.

Was mache ich falsch? Kann mir da draußen jemand helfen?

XBMCuser
quelle

Antworten:

31

Wie andere bereits auf den Unterschied zwischen Umleitungsoperatoren >(Überschreiben) und >>(Anhängen) hingewiesen haben , werde ich einige Lösungen nennen.

  1. Sie können die Befehlsgruppierungsfunktion {}von verwenden bash, um die Ausgabe aller Befehle in einer einzigen Datei zu senden:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Alternativ können Sie die Befehle in einer Subshell ausführen ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
heemayl
quelle
1
Welche Lösung gilt als die allgemeinere / tragbare {}oder ()? Vielen Dank.
Codeaviator
5
@codeaviator Subshell: ().
Heemayl
5

Sie müssen den Append-Redirector >>anstelle >der folgenden Befehle verwenden, z

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 

Siehe den Appending Redirected OutputAbschnitt der bash-Handbuchseite ( man bash).

Stahlfahrer
quelle
1

Der >Redirector schreibt die Ausgabe des Befehls ( stdoutnicht stderr- Sie verwenden sie 2>dafür) in die danach angegebene Datei. Wenn es bereits existiert, wird die Datei überschrieben.

Dieses Verhalten ist nützlich für den ersten Ihrer Befehle: Wenn eine Datei vorhanden ist, sollte diese gelöscht und durch die neue ersetzt werden.

Da Sie jedoch alle weiteren Ausgaben anhängen müssen, anstatt die vorherigen zu ersetzen, müssen Sie den Append-Redirector verwenden >>. Dadurch wird eine Datei erstellt, falls sie noch nicht vorhanden ist, die umgeleitete Ausgabe wird jedoch an die Datei angehängt , sofern sie bereits vorhanden ist.


Verwenden Sie die Pipe nicht |, um mehrere Befehle in eine Zeile zu schreiben. Dadurch würde die Ausgabe ( stdout) des ersten Befehls auf die Eingabe ( stdin) des zweiten Befehls umgeleitet .

Mit dem Semikolon ( ;) können Sie bash einfach anweisen, einen Befehl nach dem anderen auszuführen, als wäre es eine Skriptdatei. Wenn ein Befehl fehlschlägt (der Rückkehrcode ist nicht 0), werden die verbleibenden Befehle weiterhin ausgeführt.

Oder Sie können die logischen Operatoren AND ( &&) oder OR ( ||) wählen :
Wenn Sie &&zwei Befehle verbinden, wird der zweite nur ausgeführt, wenn der erste erfolgreich ist (Rückkehrcode ist 0). Wenn dies fehlschlägt, wird keiner der folgenden Befehle ausgeführt.
Der zweite Befehl wird ||jedoch nur ausgeführt, wenn der erste fehlgeschlagen ist (Rückkehrcode ungleich 0)!

In Ihrem Fall würde ich Ihnen empfehlen, das Semikolon zu verwenden:

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