Capturez toute la sortie dun script dans un fichier (à partir du script lui-même) [duplicate]

Cette question a déjà des réponses ici :

Commentaires

  • Pour ceux qui finissent ici par Google, vous pouvez également envisager cette réponse ( unix.stackexchange.com/a/164017/103505 ) pour simplement mettre tout le code que vous souhaitez afficher dans une fonction du script, puis rediriger la sortie de cette fonction.

Réponse

Une méthode que jai trouvée pour capturer toutes les sorties de nimporte quelle session consiste à démarrer une nouvelle session bash et à créer un fichier journal. cest vraiment utile pour suivre plus quun simple script.

 bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended 

ou vous pouvez simplement lancer le script lui-même

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Commentaires

  • Votre solution traite STDOUT, mais pas STDERR
  • Jai mis un exemple avec 2>&1
  • Je ne ' Je pense que cela répond à la question car lexigence n ° 1 a été " exécutée ./myscript.sh sans constructions de shell supplémentaires ".
  • Cette question a été modifiée il y a 6 heures, je ne lai pas fait ' Je nai pas cette information quand jai répondu pour la première fois à la question. Il utilisait la sortie > au lieu de tee et cest pourquoi jai partagé loption pour tee.

Réponse

Vous pouvez toujours appeler script dans un script pour consigner tout.

Comme pour tout imprimer et tout consigner en même temps dans un script bash dans log.txt:

Affichage du journal log.txt:

$ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018 

Commentaires

  • Si je comprends bien (quelques explications aideraient :), le script essaie de détecter si ' fonctionne sous script, et ne pas se réexécuter. Depuis Ubuntu 20, il semble que $SCRIPT nest pas défini, donc le script entre dans une boucle infinie.
  • Bonne idée dutiliser script cependant, car il permet une sortie de terminal interactive, par exemple Retour chariot, au travail. En effet, les commandes qui affichent une sortie de progression sur une seule ligne (archiveurs par exemple), se comportent normalement . Pour résoudre le problème de la boucle infinie, nous pouvons tester le niveau du shell : if (( $SHLVL < 3 )); then script...; fi.
  • Aussi, les arguments des scripts finissent par être concaténés et passés dans largument code au shell démarré par script (pas /bin/bash, cet argument /bin/bash est ignoré avec util-linux script)

Réponse

Vous souhaitez utiliser le tee .

Ex:

echo "Hello World" | tee out.txt 

Ceci crée un fichier out.txt avec la sortie de la commande et laffiche à lécran. Utilisez « tee -a filename » si vous voulez ajouter au fichier.

echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

out.txt aura deux lignes Hello et World (sans -a it naurait que le monde)

Si vous souhaitez enregistrer le script entier et afficher le script entier:

./script.sh | tee output.txt 

Commentaires

  • Votre solution traite STDOUT, mais pas STDERR
  • unix.stackexchange.com/a/61932/268823 explique comment faire STDOUT et STDERR
  • Je ne ' ne pense pas que cela répond à la question car lexigence n ° 1 était " run ./myscript.sh sans constructions shell supplémentaires ".
  • Je suppose quune façon de le faire serait pour tout mettre dans une fonction, et utilisez le tee à la fin. Cela fonctionnerait efficacement comme une capture de début et darrêt. Et rediriger le STDERR si telle est lintention.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *