¿Hay una manera fácil de registrar toda la actividad que hace un script de shell?

18

¿Hay una manera fácil de registrar toda la actividad que ocurre desde un script de shell en un archivo?

Tengo un guion Produce cosas como "instrucciones" de eco, así como otros resultados del programa. Sé los comandos:

command | tee -a "$log_file"

y

command >> logifle.log

Lo que pregunto es si hay un parámetro de shell para iniciar sesión, o un comando set que pueda usar o algo así. No necesariamente quiero agregar docenas de redireccionamientos o tee a los archivos si no es necesario. Sin embargo, todavía quiero obtener la salida estándar, solo quiero que se registre: wq

j0h
fuente
55
LOL: wq como si estuviera en vim '
j0h
1
me sorprende que la mayoría de las personas parezcan hacer eso en lugar de: x
Disculparse y reinstalar a Monica el

Respuestas:

18

si normalmente ejecuta su script con foo.sh, intente ejecutarlo (suponiendo que sea un script bash) con bash -x foo.sh. Si desea que todo se redirija al archivo, intente bash -x foo.sh > file.log 2>&1(tenga en cuenta que también estoy redirigiendo stderr, elimine el 2>&1si no lo desea). Si también quiere ver lo que está pasando, bash -x foo.sh 2>&1 | tee log.file.

roadmr
fuente
20

Hay una manera muy fácil y práctica:

Utilizando scriptpara hacer mecanografiado de sesión terminal

  1. Inicia el comando script

    Si filese da el argumento , por ejemplo script ~/tmp/output, scriptguarda el diálogo en este archivo. Si no se proporciona un nombre de archivo, el diálogo se guarda en el archivotypescript

  2. Comience su script o lo que quiera comenzar

  3. Si su script está terminado, deténgase a scripttravés de Ctrl-D

  4. Verifique la salida en el archivo de salida predeterminado typescript


Para comenzar su comando en un paso script, use el parámetro-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.

El uso de scriptdentro de su script no tiene sentido porque scriptbifurca el shell o inicia un nuevo shell.

Si la variable SHELL existe, el shell bifurcado por el script será ese shell. Si SHELL no está configurado, se asume el shell Bourne. (La mayoría de los shells configuran esta variable automáticamente).

AB
fuente
44
@Fabby Me gusta mi respuesta, pero no veo la pequeña cosa gris;)
AB
Yo uso script logfilename, así que puedo elegirlo.
waltinator
¿Puedo llamar "script" desde mi programa de shell?
j0h
1
Esto no tiene sentido, vea mi respuesta mejorada.
AB
1
+1. Gracias por esta respuesta :-) scriptes útil también un monitoreo a través de un fifo. De man script: " -f, --flushDescarga de salida después de cada escritura. Esto es bueno para la telecooperación: una persona lo hace mkfifo foo; script -f fooy otra puede supervisar en tiempo real lo que se está haciendo usando cat foo". También se puede usar para monitorear cuando un programa está esperando entrada o se realiza, por ejemplo, monitoreando la marca de tiempo del fifo.
sudodus