Speichern Sie alle Terminalausgaben in einer Datei

61

Gibt es eine Möglichkeit, die gesamte Terminalausgabe mit einem Befehl in einer Datei zu speichern?

  • Ich spreche nicht von Umleitung command > file.txt
  • Nicht die Geschichte history > file.txt, ich brauche den vollständigen Terminal-Text
  • Nicht mit Hotkeys!

So etwas wie terminal_text > file.txt

rsm
quelle
Ein mögliches Duplikat , trotzdem danke :)
ABcDexter
Viele GUI-Terminalemulatoren erlauben das Speichern des Bildlaufpuffers, aber dies ist für Befehle nicht zugänglich (abgesehen von xdotooldieser Art von schwarzer Kunst).
Gegenmodus
1
Versuchen Sie Terminal-Menü -> Shell -> Text exportieren
Magne

Antworten:

70

Sie können verwenden script. Grundsätzlich wird alles gespeichert, was in dieser scriptSitzung auf dem Terminal gedruckt wurde .

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

Sie können eine scriptSitzung starten , indem Sie einfach scriptdas Terminal eingeben . Alle nachfolgenden Befehle und ihre Ausgaben werden in einer Datei gespeichert, die typescriptim aktuellen Verzeichnis benannt ist. Sie können das Ergebnis auch in einer anderen Datei speichern, indem Sie scriptwie folgt beginnen :

script output.txt

Geben Sie screeneinfach Folgendes ein, um sich von der Sitzung abzumelden (Speichern des Inhalts beenden) exit.

Hier ist ein Beispiel:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Wenn ich jetzt die Datei lese:

$ 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

scriptEs gibt auch viele Optionen, z. B. "Leise ausführen" -q( --quiet), ohne Programmnachrichten anzuzeigen / zu speichern. Es kann auch einen bestimmten Befehl -c( --command) anstelle einer Sitzung ausführen. Es gibt auch viele andere Optionen. Überprüfen Sie man script, um mehr Ideen zu erhalten.

heemayl
quelle
1
Kann es nachträglich aufgerufen werden? (dh am Ende einer Sitzung) Oder muss es vor dem Inhalt aufgerufen werden, den Sie protokollieren möchten?
Stimmen
@ tjt263 Es muss aufgerufen werden, bevor der Inhalt gespeichert werden soll.
heemayl
4
Verdammt. Das ist eine Schande. Ich weiß normalerweise nicht, dass ich es erst danach will.
Stimmen
@ tjt263 du könntest es in deine .bashrc einfügen und alles in / tmp anhängen.
Phil294
1
Um es rückwirkend zu exportieren, versuchen Sie Terminal-Menü -> Shell -> Text exportieren als, wie hier: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne
12

Auch ich hatte das gleiche Problem und fand nach einiger Suche diese Lösung:

Fügen Sie zu Ihren .bash_aliases Folgendes hinzu:

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

Fügen Sie am Ende Ihrer .bashrc-Datei Folgendes hinzu:

smart_script

Danach wird der Befehl "script" einmal in jeder Terminalsitzung ausgeführt und alles in "~ / Terminal_typescripts / raw" protokolliert. Wenn Sie möchten, können Sie aktuelles Sitzungsprotokoll speichern nach der Tat (am Ende der Sitzung) , indem Sie ‚savelog‘ oder ‚savelog logname‘ - der aktuellen Raw - Log kopiert zu ‚~ / Terminal_typescripts / manual‘ und auch lesbar erstellen TXT-Protokoll in diesem Ordner. (Wenn Sie dies vergessen, befinden sich die unformatierten Protokolldateien weiterhin in ihrem Ordner. Sie müssen sie nur suchen.) Sie können auch mit der Aufzeichnung in einer neuen Protokolldatei beginnen, indem Sie 'startnewlog' eingeben.

Es wird eine Menge Junk-Log-Dateien geben, aber Sie können von Zeit zu Zeit alte bereinigen, so dass dies kein großes Problem darstellt.

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

alexpad
quelle
Warum benötigen Sie den Befehl 'exit', nachdem Sie die Protokollierung gestartet haben?
Danijel
Scheint, als würde der Aufruf des "script" -Befehls aus dem .bash_profile unter Mac OSX merkwürdige Auswirkungen auf die Shell haben. Wissen Sie, ob dies unter OSX funktionieren sollte?
Danijel