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
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-linuxscript
)
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.
2>&1
>
au lieu de tee et cest pourquoi jai partagé loption pour tee.