J'ai un script bash avec beaucoup de sortie et je voudrais changer ce script (pas en créer un nouveau) pour copier toute la sortie dans un fichier, tout comme cela se produirait si je le canalisais via tee.
J'ai un fichier script.sh :
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
et je voudrais faire une copie de STDOUT dans un fichier script.log sans avoir à taper à ./script.sh | tee script.log
chaque fois.
Merci Tom
Réponses:
Je ne pouvais pas faire fonctionner le très simple one-liner de Dennis, alors voici une méthode beaucoup plus compliquée. J'essaierais le premier.
Comme mentionné, vous pouvez utiliser exec pour rediriger l'erreur standard et la sortie standard pour l'ensemble du script. Comme ceci:
exec > $LOGFILE 2>&1
Cela affichera tous les stderr et stdout dans $ LOGFILE.Maintenant, puisque vous voulez que cela soit affiché sur la console ainsi qu'un fichier journal, vous devrez également utiliser un canal nommé pour que exec puisse écrire et té pour lire.
(La doublure de Dennis fait également cela techniquement, bien que de manière évidemment différente) La pipe elle-même est créée avec
mkfifo $PIPEFILE
. Procédez ensuite comme suit.Si vous voulez être minutieux, vous pouvez créer et détruire le fichier de canal nommé au début et à la fin de votre script.
Pour mémoire, j'ai glané la plupart de cela dans un article de blog très informatif d'un gars au hasard: ( Version archivée )
la source
Ajoutez simplement ceci au début de votre script:
Cela ajoutera toutes les sorties envoyées à stdout au fichier
script.log
, en laissant le contenu précédent en place. Si vous souhaitez recommencer chaque fois que le script est exécuté, ajoutez-lerm script.log
juste avant cetteexec
commande ou supprimez-le-a
de latee
commande.L'
-i
option faittee
ignorer les signaux d'interruption et peut permettretee
d'attraper un jeu de sortie plus complet.Ajoutez cette ligne pour également détecter toutes les erreurs (dans un fichier séparé):
Les espaces entre les multiples
>
symboles sont importants.la source
Ceci est une version combinée de la réponse publiée par Dennis Williamson plus tôt. Ajoute à la fois err & std à script.log dans le bon ordre.
Ajoutez cette ligne au début de votre script:
Notez l'espace entre les
>
panneaux. Fonctionne pour moi sur GNU bash, version 3.2.25 (1) -release (x86_64-redhat-linux-gnu)la source
Je suppose qu'une autre approche ressemble à ceci:
la source
Si vous souhaitez une copie de la sortie, vous pouvez utiliser
tee
cette méthode:Cela n'enregistrera cependant stdout que dans script.log. Si vous voulez vous assurer que les deux stderr et stdout sont redirigés, utilisez:
Vous pourriez même le rendre un peu plus agréable avec une petite fonction:
la source
2>&1
sortie standard, je laisserais juste le dehors et je le mettrais juste au tee.Vous utiliseriez simplement ceci:
Cela renvoie tout dans ce journal, tout, ainsi que l'afficher à l'écran. Si vous voulez la sortie FULL, voici comment procéder.
Et vous pouvez ensuite rejouer le script si vous êtes paresseux.
la source
script
s'agit d'un package, par exemple.sudo apt-get install script
pour l'installer sur des distributions à saveur Debian , ilscript -ac 'command opts' ~/Documents/some_log.script
peut en outre être examiné dans un terminal via quelque chose commestrings ~/Documents/some_log.script | more
;strings
être un moyen simple de pré-désinfecter certaines des choses quiscript
injectent pour permettre des méthodes plus sophistiquées de relecture / visualisation. Sinon, une réponse solide @Phishy, carscript
elle préserve également les choses interactives.Vous pouvez en savoir plus sur son fonctionnement ici: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/
la source
tee
.