Salva tutto l'output del terminale in un file


61

C'è un modo per salvare tutto l'output del terminale in un file con un comando?

  • Non sto parlando di reindirizzamento command > file.txt
  • Non la storia history > file.txt, ho bisogno del testo completo del terminale
  • Non con i tasti di scelta rapida!

Qualcosa di simile a terminal_text > file.txt


Un possibile duplicato , comunque grazie :)
ABcDexter

Molti emulatori di terminali GUI consentono di salvare il buffer di scorrimento, ma questo non è accessibile ai comandi (lasciando da parte xdotoole questo tipo di arte nera).
Contromodalità

1
Prova il menu Terminale -> Shell -> Esporta testo come, come qui: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Risposte:


70

È possibile utilizzare script. In pratica salverà tutto ciò che è stato stampato sul terminale in quella scriptsessione.

Da 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).

È possibile avviare una scriptsessione semplicemente digitando scriptnel terminale, tutti i comandi successivi e i loro output verranno tutti salvati in un file denominato typescriptnella directory corrente. Puoi salvare il risultato anche in un altro file semplicemente iniziando scriptcome:

script output.txt

Per disconnettersi dalla screensessione (interrompere il salvataggio dei contenuti), basta digitare exit.

Ecco un esempio:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Ora se leggo il file:

$ 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

scriptha anche molte opzioni, ad esempio eseguendo tranquillamente -q( --quiet) senza mostrare / salvare i messaggi di programma, può anche eseguire un comando specifico -c( --command) piuttosto che una sessione, ha anche molte altre opzioni. Controlla man scriptper avere più idee.


1
Può essere invocato dopo il fatto? (cioè alla fine di una sessione) O deve essere invocato prima del contenuto che si desidera registrare?
voci

@ tjt263 Deve essere invocato prima del contenuto che si desidera salvare ..
heemayl

4
Dannazione. È un peccato. Di solito non so di volerlo fino a dopo.
voci

@ tjt263 potresti metterlo nel tuo .bashrc e aggiungere tutto in / tmp.
phil294,

1
Per esportarlo in modo retroattivo, prova il menu Terminale -> Shell -> Esporta testo come, come qui: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

Anch'io ho affrontato lo stesso problema e dopo alcune ricerche ho trovato questa soluzione:

Aggiungi ai tuoi .bash_aliases questo:

# 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'
}

E alla fine del tuo file .bashrc aggiungi questo:

smart_script

Dopo aver fatto ciò, il comando "script" verrà eseguito una volta in ogni sessione del terminale, registrando tutto in "~ / Terminal_typescripts / raw". Se lo desideri, puoi salvare il registro della sessione corrente dopo il fatto (alla fine della sessione) digitando 'savelog' o 'savelog logname' - questo copierà il registro grezzo corrente in '~ / Terminal_typescripts / manual' e creerà anche leggibile .txt accedi a questa cartella. (Se si dimentica di farlo, i file di registro non elaborati rimarranno nella loro cartella, sarà sufficiente trovarli.) Inoltre, è possibile avviare la registrazione in un nuovo file di registro digitando "startnewlog".

Ci saranno molti file di registro spazzatura, ma di tanto in tanto puoi pulire quelli vecchi, quindi non è un grosso problema.

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


Perché è necessario il comando 'exit' dopo aver avviato la registrazione?
Danijel,

Sembra che chiamare il comando "script" dal file .bash_profile su Mac OSX abbia uno strano effetto sulla shell. Sai se questo dovrebbe funzionare su OSX?
Danijel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.