Збережіть весь термінальний вихід у файл


61

Чи є якийсь спосіб збереження всього термінального виводу у файл командою?

  • Я не кажу про перенаправлення command > file.txt
  • Не історія history > file.txt, мені потрібен повний текст терміналу
  • Не з гарячими клавішами!

Щось на зразок terminal_text > file.txt


Можливий дублікат , все-таки дякую :)
ABcDexter

Багато емуляторів терміналів GUI дозволяють зберегти буфер прокрутки, але це недоступно для команд (не залишаючи в стороні xdotoolта такого роду чорне мистецтво).
контрмод

1
Спробуйте меню терміналу -> Оболонка -> Експортуйте текст як, наприклад, тут: mactricksandtips.com/2013/04/save-terminals-text-output.html
Магне

Відповіді:


70

Можна використовувати script. Це, в основному, збереже все, що надрукується на терміналі на цьому scriptсеансі.

Від 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).

Ви можете розпочати scriptсеанс, просто ввівши scriptтермінал, всі наступні команди та їх виходи будуть збережені у файлі, названому typescriptв поточному каталозі. Ви також можете зберегти результат у інший файл, просто почавши script:

script output.txt

Щоб вийти з screenсеансу (зупиніть збереження вмісту), просто введіть exit.

Ось приклад:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Тепер, якщо я прочитав файл:

$ 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також є багато варіантів, наприклад, тихо працює -q( --quiet) без показу / збереження програмних повідомлень; він також може запускати певну команду -c( --command), а не сеанс, він також має багато інших параметрів. Поставте прапорець, man scriptщоб отримати більше ідей.


1
Чи можна викликати його після факту? (тобто наприкінці сеансу) Або потрібно його викликати перед тим вмістом, який ви хочете записати?
голоси

@ tjt263 Його потрібно викликати перед тим, як потрібно зберегти вміст ..
heemayl

4
Блін. Це ганьба. Я, як правило, не знаю, що хочу до цього часу.
голоси

@ tjt263 ви можете помістити його у свій .bashrc і додати все до / tmp.
phil294

1
Для того, щоб експортувати його заднім числом, спробуйте Terminal меню -> Shell -> Експорт тексту , як, наприклад , тут: mactricksandtips.com/2013/04/save-terminals-text-output.html
Магне

12

Я теж зіткнувся з тією ж проблемою і після деякого пошуку придумав це рішення:

Додайте до цього .bash_aliases це:

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

І до кінця .bashrc-файлу додайте це:

smart_script

Після цього команда "script" буде виконуватися один раз на кожному термінальному сеансі, записуючи все до "~ / Terminal_typescripts / raw". Якщо ви хочете, ви можете зберегти поточний журнал сеансу після факту (наприкінці сеансу) , ввівши "savelog" або "loglog logname" - це скопіює поточний необроблений журнал у '~ / Terminal_typescripts / manual', а також створить читабельний .txt у цій папці. (Якщо ви забудете це зробити, неочищені файли журналів все ще будуть знаходитись у їхній папці, вам просто доведеться їх знайти.) Також ви можете почати запис у новий файл журналу, ввівши "startnewlog".

Файлів із небажаним журналом буде багато, але ви можете періодично чистити старі, тому це не велика проблема.

(На основі https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131 , https://askubuntu.com/a/493326/473790 )


Навіщо вам потрібна команда «вихід» після того, як ви розпочали журнал?
Даніель

Схоже, виклик команди "script" з .bash_profile на Mac OSX має якийсь дивний вплив на оболонку. Чи знаєте ви, чи має це працювати на OSX?
Даніель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.