Existe-t-il un moyen simple de consigner toutes les activités d'un script shell?

18

Existe-t-il un moyen simple de consigner toutes les activités qui se produisent à partir d'un script shell dans un fichier?

J'ai un script. Il produit des choses comme des "instructions" d'écho, ainsi que d'autres sorties de programme. Je connais les commandes:

command | tee -a "$log_file"

et

command >> logifle.log

Ce que je demande, c'est s'il existe un paramètre shell pour la journalisation, ou une commande set que je peux utiliser ou quelque chose comme ça. Je ne veux pas nécessairement ajouter des dizaines de redirections ou des tés aux fichiers si je n'ai pas à le faire. Je veux toujours obtenir une sortie std - je veux juste aussi qu'elle soit enregistrée.: Wq

j0h
la source
5
LOL,: wq comme j'étais en vim '
j0h
1
cela me dérange que la plupart des gens semblent le faire au lieu de: x
S'excuser et réintégrer Monica

Réponses:

18

si vous exécutez normalement votre script avec foo.sh, essayez de l'exécuter (en supposant qu'il s'agit d'un script bash) avec bash -x foo.sh. Si vous voulez que tout soit redirigé vers un fichier, essayez bash -x foo.sh > file.log 2>&1(notez que je redirige également stderr, supprimez le 2>&1si vous ne le souhaitez pas). Si vous voulez aussi voir ce qui se passe, bash -x foo.sh 2>&1 | tee log.file.

roadmr
la source
20

Il existe un moyen très simple et pratique:

Utilisation scriptpour créer un script de session de terminal

  1. Lancer la commande script

    Si l'argument fileest donné, par exemple script ~/tmp/output, scriptenregistre le dialogue dans ce fichier. Si aucun nom de fichier n'est donné, la boîte de dialogue est enregistrée dans le fichiertypescript

  2. Commencez votre script ou ce que vous voulez commencer

  3. Si votre script est terminé, arrêtez scriptvia Ctrl-D

  4. Vérifiez la sortie dans le fichier de sortie par défaut typescript


Pour démarrer votre commande en une seule étape avec script, utilisez le paramètre-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

L'utilisation de l' scriptintérieur de votre script n'a pas de sens, car il scriptfourche le shell ou démarre un nouveau shell.

Si la variable SHELL existe, le shell forké par script sera ce shell. Si SHELL n'est pas défini, le shell Bourne est supposé. (La plupart des shells définissent cette variable automatiquement).

UN B
la source
4
@Fabby J'aime ma réponse, mais je ne vois pas la petite chose grise;)
AB
J'utilise script logfilename, donc je peux le choisir.
waltinator du
puis-je appeler "script" depuis mon programme shell?
j0h
1
Cela n'a aucun sens, voir ma réponse améliorée.
AB
1
+1. Merci pour cette réponse :-) scriptest utile aussi une surveillance via un fifo. Extrait de man script: " -f, --flushVider la sortie après chaque écriture. C'est bien pour la télécoopération: une personne le fait mkfifo foo; script -f fooet une autre peut superviser en temps réel ce qui se fait en utilisant cat foo". Il peut également être utilisé pour surveiller quand un programme est en attente d'entrée ou fait par exemple en surveillant l'horodatage du fifo.
sudodus