Enregistrer toutes les sorties du terminal dans un fichier


61

Existe-t-il un moyen de sauvegarder toutes les sorties du terminal dans un fichier avec une commande?

  • Je ne parle pas de redirection command > file.txt
  • Pas l'histoire history > file.txt, j'ai besoin du texte complet du terminal
  • Pas avec les raccourcis clavier!

Quelque chose comme terminal_text > file.txt



De nombreux émulateurs de terminaux d'interface graphique permettent de sauvegarder le tampon de défilement, mais celui-ci n'est pas accessible aux commandes (en laissant de côté xdotoolet ce genre d'art noir).
Contre-mode

1
Essayez le menu Terminal -> Shell -> Exporter le texte comme, comme ici: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Réponses:


71

Vous pouvez utiliser script. En gros, tout ce qui est imprimé sur le terminal au cours de cette scriptsession sera sauvegardé .

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

Vous pouvez démarrer une scriptsession en tapant simplement scriptle terminal. Toutes les commandes suivantes ainsi que leurs sorties seront toutes enregistrées dans un fichier nommé typescriptdans le répertoire en cours. Vous pouvez également enregistrer le résultat dans un fichier différent en commençant simplement par script:

script output.txt

Pour vous déconnecter de la screensession (arrêter d'enregistrer le contenu), tapez simplement exit.

Voici un exemple:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Maintenant, si je lis le fichier:

$ 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

scriptpossède également de nombreuses options, par exemple, exécuter tranquillement -q( --quiet) sans afficher / enregistrer les messages du programme, il peut également exécuter une commande spécifique -c( --command) plutôt qu'une session, il dispose également de nombreuses autres options. Vérifiez man scriptpour obtenir plus d'idées.


1
Peut-il être invoqué après coup? (c.-à-d. à la fin d'une session) Ou doit-il être appelé avant que le contenu que vous souhaitez consigner?
voix

@ tjt263 Il doit être invoqué avant le contenu que vous souhaitez enregistrer.
heemayl

4
Zut. C'est une honte. Habituellement, je ne sais pas si je le veux avant.
voix

@ tjt263 vous pouvez le mettre dans votre .bashrc et tout ajouter dans / tmp.
phil294

1
Pour l'exporter de manière rétroactive, essayez le menu Terminal -> Shell -> Exporter le texte, comme ici: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

Moi aussi j'ai fait face au même problème et après quelques recherches, j'ai trouvé cette solution:

Ajoutez à vos .bash_aliases ceci:

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

Et à la fin de votre fichier .bashrc, ajoutez ceci:

smart_script

Une fois que vous avez terminé, la commande "script" est exécutée une fois dans chaque session de terminal. Elle enregistre tout dans "~ / Terminal_typescripts / raw". Si vous le souhaitez, vous pouvez enregistrer le journal de la session en cours après le fait (à la fin de la session) en tapant "savelog" ou "savelog logname"; le journal brut actuel sera alors copié dans "~ / Terminal_typescripts / manual" et créera également des informations lisibles. Journal .txt dans ce dossier. (Si vous oubliez de le faire, les fichiers journaux bruts seront toujours dans leur dossier, il vous suffira de les trouver.) Vous pouvez également commencer à enregistrer dans un nouveau fichier journal en tapant "startnewlog".

Il y aura beaucoup de fichiers journaux indésirables, mais vous pouvez nettoyer les anciens de temps en temps, donc ce n'est pas un gros problème.

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


Pourquoi avez-vous besoin de la commande 'exit' après avoir commencé la journalisation?
Danijel le

On dirait que l'appel de la commande "script" à partir du fichier .bash_profile sous Mac OSX a un effet étrange sur le shell. Savez-vous si cela devrait fonctionner sous OSX?
Danijel le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.