Écrire la sortie de plusieurs commandes séquentielles dans un fichier texte

22

J'essaie de vérifier la dernière version de Firefox et je veux obtenir tous les hachages dans un fichier TXT.

Ce que j'essaie de faire, c'est:

sha1sum firefox.tar.gz > sha.txt

et j'essaye aussi:

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

mais seulement le dernier dans ce cas, le sha512 est imprimé dans le sha.txt.

Qu'est-ce que je fais mal? S'il vous plaît, quelqu'un peut-il m'aider?

XBMCuser
la source

Réponses:

31

Comme d’autres ont déjà souligné la différence entre >(écraser) et>> (ajouter) les opérateurs de redirection, je vais donner quelques solutions.

  1. Vous pouvez utiliser la {}fonction de regroupement de commandes de bashpour envoyer la sortie de toutes les commandes dans un seul fichier:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Vous pouvez également exécuter les commandes dans un sous-shell ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
heemayl
la source
1
Quelle solution est considérée comme la plus générique / portable {}ou ()? Merci.
codeaviator
5
@codeaviator sous - shell: ().
heemayl
5

Vous devez utiliser le redirecteur append >>au lieu de >pour les commandes suivantes, par exemple

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 

Voir la Appending Redirected Outputsection de la page de manuel bash ( man bash).

tournevis
la source
1

Le >redirecteur écrit la sortie de la commande ( stdout, pas stderr- vous utilisez 2>pour cela) dans le fichier spécifié après. S'il existe déjà, le fichier sera écrasé.

Ce comportement est utile pour la première de vos commandes: s'il existe un fichier existant, il doit être supprimé et remplacé par le nouveau.

Cependant, comme vous devez ajouter toutes les autres sorties au lieu de remplacer les précédentes, vous devez utiliser le redirecteur-append >>. Cela créera un fichier s'il n'existe pas encore, mais ajoute la sortie redirigée au fichier, s'il existe déjà.


Et veuillez ne pas utiliser le canal |pour écrire plusieurs commandes sur une seule ligne, ce qui redirigerait la sortie de la première commande ( stdout) vers l'entrée de la deuxième commande ( stdin).

Vous pouvez utiliser le point-virgule (; ) pour simplement dire à bash d'exécuter une commande après l'autre, comme s'il s'agissait d'un fichier de script. Si une commande échoue (le code retour n'est pas 0), les commandes restantes sont toujours exécutées.

Ou vous pouvez choisir les opérateurs logiques AND ( &&) ou OR ( ||):
Si vous utilisez &&pour connecter deux commandes, la seconde ne sera exécutée que si la première réussit (le code retour est 0). S'il échoue, aucune des commandes suivantes ne s'exécutera.
Le ||cependant n'exécute la seconde commande si le premier n'a pas (code retour est 0)!

Donc, dans votre cas, je vous recommande d'utiliser le point-virgule:

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