Zapisz wszystkie dane wyjściowe terminala w pliku


61

Czy istnieje jakiś sposób zapisania wszystkich danych wyjściowych terminala do pliku za pomocą polecenia?

  • Nie mówię o przekierowaniu command > file.txt
  • Nie historia history > file.txt, potrzebuję pełnego tekstu terminala
  • Nie z klawiszami skrótu!

Coś jak terminal_text > file.txt


Możliwe duplikaty , w każdym razie dzięki :)
ABcDexter

Wiele emulatorów terminali GUI pozwala zapisać bufor przewijania, ale nie jest to dostępne dla poleceń (pozostawiając na boku xdotooli tego rodzaju czarną grafikę).
kontr

1
Wypróbuj menu Terminal -> Powłoka -> Eksportuj tekst jako, jak tutaj: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Odpowiedzi:


70

Możesz użyć script. W zasadzie zapisze wszystko wydrukowane na terminalu w tej scriptsesji.

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

Możesz rozpocząć scriptsesję, wpisując scriptterminal, wszystkie kolejne polecenia i ich dane wyjściowe zostaną zapisane w pliku o nazwie typescriptw bieżącym katalogu. Możesz również zapisać wynik w innym pliku, zaczynając od script:

script output.txt

Aby się wylogować z screensesji (przestań zapisywać zawartość), po prostu wpisz exit.

Oto przykład:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Teraz, jeśli przeczytam plik:

$ 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

scriptma również wiele opcji, np. działa cicho -q( --quiet) bez pokazywania / zapisywania komunikatów programu, może także uruchamiać określone polecenie -c( --command) zamiast sesji, ma także wiele innych opcji. Sprawdź, man scriptaby uzyskać więcej pomysłów.


1
Czy można się na nią powołać po fakcie? (tj. na koniec sesji) Czy może trzeba go wywołać przed zawartością, którą chcesz zalogować?
głosy

@ tjt263 Należy go przywołać przed treścią, którą chcesz zapisać.
heemayl

4
Cholera. Jaka szkoda. Zwykle nie wiem, czy chcę tego później.
głosy

@ tjt263 możesz umieścić go w swoim .bashrc i dołączyć wszystko do / tmp.
phil294

1
Aby wyeksportować go z mocą wsteczną, spróbuj menu Terminala -> Powłoka -> Eksportuj tekst jako, jak tutaj: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

Ja również napotkałem ten sam problem i po kilku poszukiwaniach wpadłem na to rozwiązanie:

Dodaj do .bash_aliases to:

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

Na końcu pliku .bashrc dodaj:

smart_script

Po wykonaniu tej czynności komenda „script” będzie wykonywana raz w każdej sesji terminalu, rejestrując wszystko do '~ / Terminal_typescripts / raw'. Jeśli chcesz, możesz zapisać bieżący dziennik sesji po fakcie (pod koniec sesji) , wpisując „savelog” lub „savelog logname” - spowoduje to skopiowanie bieżącego surowego dziennika do „~ / Terminal_typescripts / manual”, a także utworzenie czytelnego .txt zaloguj się do tego folderu. (Jeśli zapomnisz to zrobić, nieprzetworzone pliki dziennika będą nadal znajdować się w ich folderze, po prostu będziesz musiał je znaleźć.) Możesz także rozpocząć nagrywanie do nowego pliku dziennika, wpisując „startnewlog”.

Będzie wiele niepotrzebnych plików dziennika, ale od czasu do czasu możesz wyczyścić stare, więc nie jest to duży problem.

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


Dlaczego potrzebujesz komendy „exit” po rozpoczęciu rejestrowania?
Danijel

Wygląda na to, że wywołanie polecenia „script” z pliku .bash_profile w systemie Mac OSX ma dziwny wpływ na powłokę. Czy wiesz, czy to powinno działać na OSX?
Danijel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.