Guardar toda la salida del terminal en un archivo

61

¿Hay alguna forma de guardar toda la salida del terminal en un archivo con un comando?

  • No estoy hablando de redireccionamiento command > file.txt
  • No es la historia history > file.txt, necesito el texto completo del terminal
  • ¡No con teclas de acceso rápido!

Algo como terminal_text > file.txt

rsm
fuente
Un posible duplicado , de todos modos, gracias :)
ABcDexter
Muchos emuladores de terminal GUI permiten guardar el búfer de desplazamiento, pero esto no es accesible para los comandos (dejando de lado xdotooly este tipo de arte negro).
contramode
1
Pruebe el menú Terminal -> Shell -> Exportar texto como, como aquí: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Respuestas:

70

Puedes usar script. Básicamente guardará todo lo impreso en el terminal en esa scriptsesión.

De man script:

script makes a typescript of everything printed on your terminal. 
It is useful for students who need a hardcopy record of an 
interactive session as proof of an assignment, as the typescript file 
can be printed out later with lpr(1).

Puede iniciar una scriptsesión simplemente escribiendo scripten el terminal, todos los comandos posteriores y sus salidas se guardarán en un archivo con el nombre typescripten el directorio actual. También puede guardar el resultado en un archivo diferente simplemente comenzando scriptcomo:

script output.txt

Para cerrar sesión en la screensesión (deje de guardar el contenido), simplemente escriba exit.

Aquí hay un ejemplo:

$ script output.txt
Script started, file is output.txt

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Ahora si leo el archivo:

$ cat output.txt

Script started on Mon 20 Apr 2015 08:00:14 AM BDT
$ ls
output.txt  testfile.txt  foo.txt
$ exit
exit

Script done on Mon 20 Apr 2015 08:00:21 AM BDT

scripttambién tiene muchas opciones, por ejemplo, ejecutar en silencio -q( --quiet) sin mostrar / guardar mensajes del programa, también puede ejecutar un comando específico -c( --command) en lugar de una sesión, también tiene muchas otras opciones. Marque man scriptpara obtener más ideas.

heemayl
fuente
1
¿Se puede invocar después del hecho? (es decir, al final de una sesión) ¿O tiene que ser invocado antes del contenido que desea registrar?
voces
@ tjt263 Debe invocarse antes del contenido que desea guardar.
heemayl
44
Maldición. Es una pena. Por lo general, no sé que lo quiero hasta después.
voces
@ tjt263 puede ponerlo dentro de su .bashrc y agregar todo a / tmp.
phil294
1
Para exportarlo de manera retroactiva, pruebe el menú Terminal -> Shell -> Exportar texto como, por ejemplo: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne
12

Yo también enfrenté el mismo problema y después de algunas búsquedas surgió esta solución:

Agregue a sus .bash_aliases esto:

# Execute "script" command just once
smart_script(){
    # if there's no SCRIPT_LOG_FILE exported yet
    if [ -z "$SCRIPT_LOG_FILE" ]; then
        # make folder paths
        logdirparent=~/Terminal_typescripts
        logdirraw=raw/$(date +%F)
        logdir=$logdirparent/$logdirraw
        logfile=$logdir/$(date +%F_%T).$$.rawlog

        # if no folder exist - make one
        if [ ! -d $logdir ]; then
            mkdir -p $logdir
        fi

        export SCRIPT_LOG_FILE=$logfile
        export SCRIPT_LOG_PARENT_FOLDER=$logdirparent

        # quiet output if no args are passed
        if [ ! -z "$1" ]; then
            script -f $logfile
        else
            script -f -q $logfile
        fi

        exit
    fi
}

# Start logging into new file
alias startnewlog='unset SCRIPT_LOG_FILE && smart_script -v'

# Manually saves current log file: $ savelog logname
savelog(){
    # make folder path
    manualdir=$SCRIPT_LOG_PARENT_FOLDER/manual
    # if no folder exists - make one
    if [ ! -d $manualdir ]; then
        mkdir -p $manualdir
    fi
    # make log name
    logname=${SCRIPT_LOG_FILE##*/}
    logname=${logname%.*}
    # add user logname if passed as argument
    if [ ! -z $1 ]; then
        logname=$logname'_'$1
    fi
    # make filepaths
    txtfile=$manualdir/$logname'.txt'
    rawfile=$manualdir/$logname'.rawlog'
    # make .rawlog readable and save it to .txt file
    cat $SCRIPT_LOG_FILE | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > $txtfile
    # copy corresponding .rawfile
    cp $SCRIPT_LOG_FILE $rawfile
    printf 'Saved logs:\n    '$txtfile'\n    '$rawfile'\n'
}

Y al final de su archivo .bashrc agregue esto:

smart_script

Después de hacer esto, el comando "script" se ejecutará una vez en cada sesión de terminal, registrando todo en '~ / Terminal_typescripts / raw'. Si lo desea, puede guardar el registro de la sesión actual después del hecho (al final de la sesión) escribiendo 'savelog' o 'savelog logname': esto copiará el registro sin procesar actual a '~ / Terminal_typescripts / manual' y también creará una lectura .txt inicie sesión en esta carpeta. (Si olvida hacerlo, los archivos de registro sin procesar seguirán en su carpeta, solo tendrá que encontrarlos). También puede comenzar a grabar en un nuevo archivo de registro escribiendo 'startnewlog'.

Habrá muchos archivos de registro basura, pero puede limpiar los viejos de vez en cuando, por lo que no es un gran problema.

(Basado en https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131 , https://askubuntu.com/a/493326/473790 )

alexpad
fuente
¿Por qué necesita el comando 'salir' después de iniciar el registro?
Danijel
Parece que llamar al comando "script" desde el .bash_profile en Mac OSX tiene algún efecto extraño en el shell. ¿Sabes si esto debería funcionar en OSX?
Danijel