Сохранить весь вывод терминала в файл

61

Есть ли способ сохранить все выходные данные терминала в файл с помощью команды?

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

Что-то вроде terminal_text > file.txt

RSM
источник
Возможный дубликат , в любом случае спасибо :)
ABcDexter
Многие эмуляторы терминала GUI позволяют сохранять буфер прокрутки, но это недоступно для команд (оставляя в стороне xdotoolи этот вид черной графики).
контрмод
1
Попробуйте меню терминала -> Оболочка -> Экспортировать текст как здесь: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Ответы:

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чтобы получить больше идей.

heemayl
источник
1
Это может быть вызвано после факта? (т. е. в конце сеанса) Или он должен быть вызван до того, как контент, который вы хотите зарегистрировать?
голоса
@ tjt263 Он должен быть вызван до того содержимого, которое вы хотите сохранить ..
heemayl
4
Черт. Это позор. Обычно я не знаю, хочу ли я этого до тех пор, пока потом.
голоса
@ tjt263 вы можете поместить его в ваш .bashrc и добавить все в / tmp.
phil294
1
Чтобы экспортировать его задним числом, попробуйте меню «Терминал» -> «Оболочка» -> «Экспортировать текст», как показано здесь: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne
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» или «savelog logname» - это скопирует текущий необработанный журнал в «~ / Terminal_typescripts / manual», а также создаст читаемый .txt войти в эту папку. (Если вы забудете это сделать, необработанные файлы журналов по-прежнему будут находиться в их папке, вам просто нужно будет их найти.) Также вы можете начать запись в новый файл журнала, набрав «startnewlog».

Будет много ненужных файлов журналов, но вы можете время от времени очищать старые, так что это не большая проблема.

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

alexpad
источник
Зачем вам нужна команда 'exit' после начала регистрации?
Даниэль
Похоже, что вызов команды «script» из .bash_profile в Mac OSX оказывает некоторое странное влияние на оболочку. Знаете ли вы, должно ли это работать на OSX?
Даниэль