web-dev-qa-db-fra.com

Comment rediriger dd progress dans terminal vers un fichier log.txt tout en l’affichant sur le terminal au cours du processus?

Voici mon script: -

Sudo mate-terminal --geometry=50x10 -x sh -c "dd if=/dev/sda of=/dev/sdb status=progress 2>&1 | tee log.txt | md5sum > hash.txt | sha1sum > hash1.txt"

J'ai vu des gens faire cette suggestion tout le temps; mettre 2> & 1. Mais cela affichera uniquement la progression dans le fichier log.txt et le terminal n’affiche rien. Voici une image de l'état d'avancement du fichier log.txt.

logfile

Si je supprime 2>&1 et que je vais simplement avec

command | tee log.txt

Seul le terminal affichera la progression et rien ne s'affichera dans le fichier log.txt

J'ai aussi essayé: -

(command 2>&1) | log.txt

command 2> | log.txt

et beaucoup d'autres dont je ne me souviens plus. Alors quelqu'un peut-il m'aider?

3
Najmi

La progression est sortie dans STDERR plutôt que dans STDOUT. Vous pouvez obtenir quelque chose comme ce que vous voulez en faisant tail -f sur le fichier en cours d'écriture de la manière suivante:

mate-terminal --geometry=50x10 -x sh -c 'tail -f log.txt'
Sudo dd if=/dev/sda of=/dev/sdb status=progress 2> log.txt"

tail -f log.txt imprimera tout ce qui est en cours d'écriture sur log.txt sur le nouveau terminal plus petit et s'exécutera en arrière-plan afin que vous puissiez émettre plus de commandes pendant son exécution.
2> envoie le flux STDERR à log.txt. S'il y a une sortie sur STDOUT, elle s'affichera dans le terminal à partir duquel la commande ou le script est exécuté.

2
Zanna

Redirigez stderr et stdout avec |& dans bash:

Sudo mate-terminal --geometry=50x10 -x bash -c "dd if=/dev/sda of=/dev/sdb status=progress |& tee log.txt"
2
muru