web-dev-qa-db-fra.com

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

J'essaie de vérifier le dernier 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 seul 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 avec ça?

20
XBMCuser

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

  1. Vous pouvez utiliser la fonctionnalité de regroupement de commandes {} de bash pour envoyer le résultat 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
    
27
heemayl

Vous devez utiliser le redirecteur add >> 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 section Appending Redirected Output de la page de manuel bash (man bash).

5
steeldriver

Le redirecteur > écrit la sortie de la commande (stdout, et non stderr - vous utilisez 2> pour cela) dans le fichier spécifié après celle-ci. 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, il doit être supprimé et remplacé par le nouveau.

Toutefois, comme vous devez ajouter toutes les sorties supplémentaires au lieu de remplacer les précédentes, vous devez utiliser le complément-redirector >>. Cela créera un fichier s'il n'existe pas encore, mais ajoute la sortie redirigée vers le fichier, si elle existe déjà.


Et s'il vous plaît, n'utilisez pas le code | pour écrire plusieurs commandes sur une ligne, ce qui redirigerait la sortie de la première commande (stdout) vers l'entrée de la seconde 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 niquement sera exécutée, si la première réussit (le code de retour est 0). Si cela échoue, aucune des commandes suivantes ne sera exécutée.
Le || cependant seulement exécute la deuxième commande si la première a échoué (le code de retour n'est pas 0)!

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

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