Tüm terminal çıkışını bir dosyaya kaydedin


61

Tüm terminal çıkışını komutlu bir dosyaya kaydetmenin bir yolu var mı?

  • Yönlendirme hakkında konuşmuyorum command > file.txt
  • Geçmişi değil, history > file.txttam metin metnine ihtiyacım var
  • Kısayol tuşlarıyla değil!

Gibi bir şey terminal_text > file.txt


Olası bir kopya , yine de teşekkürler :)
ABcDexter

Birçok GUI terminal emülatörü, kaydırma arabelleğini kaydetmeye izin verir, ancak bu komutlara erişilemez (bir kenara xdotoolve bu tür siyah sanattan ayrılmadan ).
countermode

1
Terminal menüsünü deneyin -> Kabuk -> Metni şu şekilde olduğu gibi dışa aktar: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Yanıtlar:


70

Kullanabilirsiniz script. Temelde bu scriptoturumda terminalde basılı olan her şeyi kaydedecektir .

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

scriptSadece scriptterminale yazarak bir seans başlatabilirsiniz , izleyen tüm komutlar ve bunların çıktıları typescriptmevcut dizinde adlandırılmış bir dosyaya kaydedilir . Sonucu, tıpkı şöyle başlatarak da farklı bir dosyaya kaydedebilirsiniz script:

script output.txt

Oturumu kapatmak için screen(içeriği kaydetmeyi bırakın), sadece yazın exit.

İşte bir örnek:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Şimdi dosyayı okursam:

$ 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

scriptayrıca program mesajlarını göstermeden / kaydetmeden sessizce çalışan -q( --quiet) gibi birçok seçeneğe de sahiptir , oturum yerine belirli bir komutu -c( --command) çalıştırabilir , ayrıca birçok başka seçeneğe de sahiptir. man scriptDaha fazla fikir edinmek için kontrol edin .


1
Gerçekten sonra çağrılabilir mi? (örneğin, oturumun sonunda) Veya oturum açmak istediğiniz içeriğin önüne çağrılması gerekiyor mu?
sesler

@ tjt263 Saklamak istediğiniz içeriklerden önce çağrılması gerekiyor ..
heemayl

4
Lanet olsun. Bu utanç verici. Genelde daha sonraya kadar istediğimi bilmiyorum.
sesler

@ tjt263 .bashrc içine koyabilir ve her şeyi / tmp içine ekleyebilirsiniz.
phil294

1
Geriye dönük olarak dışa aktarmak için, Terminal menüsünü -> Kabuk -> Metni şu şekilde olduğu gibi dışa aktar: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

Ben de aynı problemle karşılaştım ve bir aramadan sonra bu çözüm geldi:

.Bash_aliases'inize şunu ekleyin:

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

Ve .bashrc dosyanızın sonuna şunu ekleyin:

smart_script

Bunu yaptıktan sonra, “script” komutu her terminal oturumunda bir kez çalıştırılacak ve her şeyi '~ / Terminal_typescripts / raw' olarak kaydedeceksiniz. İsterseniz, geçerli oturum günlüğünden sonra (oturumun sonunda) 'savelog' veya 'savelog logname' yazarak kaydedebilirsiniz - bu, mevcut ham günlüğü '~ / Terminal_typescripts / manual' dizinine kopyalar ve ayrıca okunabilir oluşturur .txt bu klasörde oturum açın. (Bunu unutursanız, ham günlük dosyaları hala klasörlerinde olacaktır, onları bulmak zorundasınız.) Ayrıca 'startnewlog' yazarak yeni bir günlük dosyasına kaydetmeye başlayabilirsiniz.

Çok fazla önemsiz günlük dosyası olacak, ancak eskileri zaman zaman temizleyebilirsiniz, bu yüzden büyük bir sorun değil.

( Https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131 , https://askubuntu.com/a/493326/473790 temel alınmıştır )


Günlüğe kaydetmeye başladıktan sonra neden 'exit' komutuna ihtiyacınız var?
Danijel

Mac OSX üzerindeki .bash_profile dosyasından "script" komutunu çağırmak gibi görünüyor Kabuk üzerinde garip bir etkisi var. Bunun OSX üzerinde çalışması gerekip gerekmediğini biliyor musunuz?
Danijel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.