บันทึกเอาต์พุตของเทอร์มินัลทั้งหมดเป็นไฟล์


61

มีวิธีการบันทึกผลลัพธ์ของเทอร์มินัลทั้งหมดไปยังไฟล์ด้วยคำสั่งหรือไม่?

  • ฉันไม่ได้พูดถึงการเปลี่ยนเส้นทาง command > file.txt
  • ไม่ใช่ประวัติhistory > file.txtฉันต้องการข้อความเทอร์มินัลแบบเต็ม
  • ไม่ได้อยู่กับปุ่มลัด!

สิ่งที่ต้องการ terminal_text > file.txt


ซ้ำเป็นไปได้ , anyways ขอบคุณ :)
ABcDexter

ตัวเลียนแบบเทอร์มินัล GUI จำนวนมากอนุญาตให้บันทึกบัฟเฟอร์การเลื่อน แต่นี่ไม่สามารถเข้าถึงคำสั่งxdotoolได้
Countermode

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เพื่อรับแนวคิดเพิ่มเติม


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

หลังจากคุณทำสิ่งนี้แล้วคำสั่ง "สคริปต์" จะถูกดำเนินการหนึ่งครั้งในทุกเซสชันเทอร์มินัลบันทึกทุกอย่างไปที่ '~ / Terminal_typescripts / raw' หากคุณต้องการคุณสามารถบันทึกเซสชั่นปัจจุบันหลังจากข้อเท็จจริง (ในตอนท้ายของเซสชั่น)โดยพิมพ์ 'savelog' หรือ 'savelog logname' - นี้จะคัดลอกบันทึกดิบปัจจุบันไปที่ '~ / Terminal_typescripts / คู่มือ' และสร้างอ่านได้ .txt เข้าสู่ระบบในโฟลเดอร์นี้ (หากคุณลืมที่จะทำเช่นนั้นไฟล์บันทึกแบบ raw จะยังคงอยู่ในโฟลเดอร์ของพวกเขาคุณจะต้องค้นหาไฟล์เหล่านั้น) นอกจากนี้คุณอาจเริ่มบันทึกลงในไฟล์บันทึกใหม่โดยพิมพ์ 'startnewlog'

จะมีไฟล์บันทึกขยะจำนวนมาก แต่คุณสามารถล้างไฟล์เก่าได้เป็นครั้งคราวดังนั้นจึงไม่ใช่ปัญหาใหญ่

(ขึ้นอยู่กับhttps://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131 , https://askubuntu.com/a/493326/473790 )


ทำไมคุณต้องใช้คำสั่ง 'ออก' หลังจากที่คุณเริ่มการบันทึก
Danijel

ดูเหมือนว่าการเรียกคำสั่ง "script" จาก. bash_profile บน Mac OSX มีผลกระทบบางอย่างกับเปลือก คุณรู้หรือไม่ว่าสิ่งนี้ควรใช้กับ OSX ได้หรือไม่?
Danijel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.