Simpan semua output terminal ke file

61

Apakah ada cara untuk menyimpan semua output terminal ke file dengan perintah?

  • Saya tidak berbicara tentang pengalihan command > file.txt
  • Bukan sejarah history > file.txt, saya perlu teks terminal lengkap
  • Tidak dengan hotkey!

Sesuatu seperti terminal_text > file.txt

rsm
sumber
Kemungkinan duplikat , terima kasih :)
ABcDexter
Banyak emulator terminal GUI memungkinkan untuk menyimpan buffer gulir, tetapi ini tidak dapat diakses oleh perintah (mengesampingkan xdotooldan seni hitam semacam ini).
countermode
1
Coba menu Terminal -> Shell -> Ekspor teks seperti, seperti di sini: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Jawaban:

70

Anda bisa menggunakannya script. Ini pada dasarnya akan menyimpan semua yang dicetak pada terminal dalam scriptsesi itu.

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

Anda dapat memulai scriptsesi hanya dengan mengetik scriptdi terminal, semua perintah berikut dan hasilnya akan disimpan dalam file yang disebutkan typescriptdalam direktori saat ini. Anda dapat menyimpan hasilnya ke file lain juga dengan hanya memulai scriptseperti:

script output.txt

Untuk keluar dari screensesi (berhenti menyimpan konten), ketikkan saja exit.

Berikut ini sebuah contoh:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Sekarang jika saya membaca file:

$ 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

scriptjuga memiliki banyak opsi mis. berjalan dengan diam-diam -q( --quiet) tanpa menampilkan / menyimpan pesan program, ia juga dapat menjalankan perintah tertentu -c( --command) daripada sesi, ia juga memiliki banyak opsi lain. Periksa man scriptuntuk mendapatkan lebih banyak ide.

heemayl
sumber
1
Bisakah itu dipanggil setelah fakta? (mis. Di akhir sesi) Atau haruskah itu dipanggil sebelum konten yang Anda ingin login?
Suara
@ tjt263 Itu harus dipanggil sebelum konten yang Anda ingin diselamatkan ..
heemayl
4
Sial. Itu memalukan. Saya biasanya tidak tahu saya menginginkannya sampai sesudahnya.
Suara
@ tjt263 Anda bisa memasukkannya ke dalam .bashrc Anda dan menambahkan semuanya ke / tmp.
phil294
1
Untuk mengekspornya secara surut, coba menu Terminal -> Shell -> Ekspor teks seperti, seperti di sini: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne
12

Saya juga menghadapi masalah yang sama dan setelah beberapa pencarian muncul dengan solusi ini:

Tambahkan ke .bash_aliases Anda:

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

Dan di akhir file .bashrc Anda, tambahkan ini:

smart_script

Setelah Anda selesai melakukan ini, perintah "script" akan dieksekusi sekali dalam setiap sesi terminal, mencatat semuanya ke '~ / Terminal_typescripts / raw'. Jika mau, Anda dapat menyimpan log sesi saat ini setelah faktanya (di akhir sesi) dengan mengetikkan 'savelog' atau 'savelog logname' - ini akan menyalin log mentah saat ini ke '~ / Terminal_typescripts / manual' dan juga membuat dapat dibaca .txt masuk ke folder ini. (Jika Anda lupa melakukannya, file log mentah akan tetap ada di folder mereka, Anda hanya harus menemukannya.) Anda juga dapat mulai merekam ke file log baru dengan mengetikkan 'startnewlog'.

Akan ada banyak file log sampah, tetapi Anda dapat membersihkan yang lama dari waktu ke waktu, jadi itu bukan masalah besar.

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

alexpad
sumber
Mengapa Anda memerlukan perintah 'keluar' setelah Anda memulai pencatatan?
Danijel
Sepertinya memanggil "script" perintah dari .bash_profile di Mac OSX memiliki beberapa efek aneh pada shell. Apakah Anda tahu apakah ini harus bekerja pada OSX?
Danijel