Salve toda a saída do terminal em um arquivo

61

Existe alguma maneira de salvar toda a saída do terminal em um arquivo com um comando?

  • Não estou falando de redirecionamento command > file.txt
  • Não é o histórico history > file.txt, preciso do texto completo do terminal
  • Não com teclas de atalho!

Algo como terminal_text > file.txt

rsm
fonte
Uma possível duplicado , de qualquer forma obrigado :)
ABcDexter
Muitos emuladores de terminal da GUI permitem salvar o buffer de rolagem, mas isso não é acessível aos comandos (deixando de lado xdotoole esse tipo de arte negra).
Countermode #:
11
Tente o menu Terminal -> Shell -> Exportar texto como, como aqui: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Respostas:

70

Você pode usar script. Basicamente, ele salvará tudo o que foi impresso no terminal nessa scriptsessão.

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

Você pode iniciar uma scriptsessão digitando apenas scriptno terminal, todos os comandos subseqüentes e suas saídas serão salvos em um arquivo nomeado typescriptno diretório atual. Você também pode salvar o resultado em um arquivo diferente, apenas começando scriptcomo:

script output.txt

Para sair da screensessão (pare de salvar o conteúdo), basta digitar exit.

Aqui está um exemplo:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Agora, se eu ler o arquivo:

$ 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

scripttambém possui muitas opções, por exemplo, rodando silenciosamente -q( --quiet) sem mostrar / salvar mensagens de programa, também pode executar um comando específico -c( --command) em vez de uma sessão, além de muitas outras opções. Marque man scriptpara obter mais idéias.

heemail
fonte
11
Pode ser invocado após o fato? (ou seja, no final de uma sessão) Ou precisa ser invocado antes do conteúdo que você deseja registrar?
vozes
@ tjt263 Tem que ser invocada perante o conteúdo que você deseja ser salvo ..
heemayl
4
Droga. Isso é uma vergonha. Normalmente, não sei se quero isso depois.
vozes
@ tjt263 você pode colocá-lo dentro do seu .bashrc e anexar tudo em / tmp.
phil294
11
Para exportá-lo de forma retroativa, tente o menu Terminal -> Shell -> Exportar texto como, como aqui: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne
12

Eu também enfrentei o mesmo problema e, após algumas pesquisas, surgiu esta solução:

Adicione ao seu .bash_aliases isto:

# 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 ao final do seu arquivo .bashrc, adicione este:

smart_script

Depois de fazer isso, o comando "script" será executado uma vez em cada sessão do terminal, registrando tudo em '~ / Terminal_typescripts / raw'. Se desejar, você pode salvar o log da sessão atual após o fato (no final da sessão) digitando 'savelog' ou 'savelog logname' - isso copiará o log bruto atual para '~ / Terminal_typescripts / manual' e também criará legível .txt faça logon nesta pasta. (Se você esquecer de fazê-lo, os arquivos de log não processados ​​ainda estarão em suas pastas, basta encontrá-los.) Além disso, você pode começar a gravar em um novo arquivo de log digitando 'startnewlog'.

Existem muitos arquivos de log indesejados, mas você pode limpar os antigos de tempos em tempos, para que não seja um grande problema.

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

alexpad
fonte
Por que você precisa do comando 'exit' após iniciar o log?
Danijel
Parece que chamar o comando "script" do .bash_profile no Mac OSX tem algum efeito estranho no shell. Você sabe se isso deve funcionar no OSX?
Danijel