web-dev-qa-db-fra.com

Enregistrer toutes les sorties du terminal dans un fichier

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 des raccourcis clavier!

Quelque chose comme terminal_text > file.txt

66
rsm

Vous pouvez utiliser script. Il enregistrera essentiellement tout ce qui est imprimé sur le terminal dans cette session script.

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 session script en tapant simplement script dans le terminal, toutes les commandes suivantes et leurs sorties seront toutes enregistrées dans un fichier nommé TypeScript dans le répertoire courant. Vous pouvez également enregistrer le résultat dans un autre fichier en démarrant simplement script comme:

script output.txt

Pour vous déconnecter de la session screen (arrêtez 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

script propose également de nombreuses options, par exemple courir 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 propose également de nombreuses autres options. Vérifier man script pour avoir plus d'idées.

79
heemayl

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

Après cela, la commande "script" sera exécutée une fois dans chaque session de terminal, enregistrant tout dans '~/Terminal_typescripts/raw'. Si vous le souhaitez, vous pouvez enregistrer le journal de session en cours après coup (à la fin de la session) en tapant 'savelog' ou 'savelog logname' - cela copiera le journal brut actuel dans '~/Terminal_typescripts/manual' et créera également un journal .txt lisible dans ce dossier. (Si vous oubliez de le faire, les fichiers journaux bruts seront toujours dans leur dossier, vous n'aurez qu'à 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/ 47379 )

13
alexpad

Comme déjà indiqué, vous pouvez utiliser script si vous savez au préalable que vous souhaiterez enregistrer le texte de la session. De plus, copier la sortie du terminal et la coller dans un éditeur de texte semble faire l'affaire, je crois.

1
ChrisGS