सभी टर्मिनल आउटपुट को एक फ़ाइल में सहेजें


61

क्या कमांड के साथ फ़ाइल में सभी टर्मिनल आउटपुट को सहेजने का कोई तरीका है?

  • मैं पुनर्निर्देशन की बात नहीं कर रहा हूँ command > file.txt
  • इतिहास नहीं history > file.txt, मुझे पूर्ण टर्मिनल पाठ की आवश्यकता है
  • हॉटकी के साथ नहीं!

कुछ इस तरह terminal_text > file.txt


एक संभव डुप्लिकेट , वैसे भी धन्यवाद :)
ABcDexter

कई जीयूआई टर्मिनल एमुलेटर स्क्रॉल बफर को बचाने की अनुमति देते हैं, लेकिन यह कमांड (एक तरफ 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अधिक विचार प्राप्त करने के लिए जाँच करें ।


1
क्या इस तथ्य के बाद इसे लागू किया जा सकता है? (यानी एक सत्र के अंत में) या क्या यह उस सामग्री से पहले लागू किया जाना है जिसे आप लॉग इन करना चाहते हैं?
आवाज

@ tjt263 इसे उन सामग्रियों से पहले मंगाना होगा जिन्हें आप बचाना चाहते हैं ..
heemayl

4
अरे नहीं। कि एक शर्म की बात है। मैं आमतौर पर नहीं जानता कि मैं इसे बाद में चाहता हूं।
आवाज

@ tjt263 आप इसे अपने .bashrc के अंदर रख सकते हैं और सब कुछ / tmp में जोड़ सकते हैं।
फिल्प

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 लॉग करें। (यदि आप ऐसा करना भूल जाते हैं, तो कच्ची लॉग फाइलें अभी भी उनके फ़ोल्डर में होंगी, आपको बस उन्हें ढूंढना होगा।) इसके अलावा आप 'startnewlog' लिखकर एक नई लॉग फ़ाइल में रिकॉर्डिंग शुरू कर सकते हैं।

बहुत सारे जंक लॉग फाइल होंगे, लेकिन आप समय-समय पर पुराने को साफ कर सकते हैं, इसलिए यह एक बड़ी समस्या नहीं है।

( Https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131 , https://askubuntu.com/a/493326/473790 पर आधारित )


लॉगिंग शुरू करने के बाद आपको 'निकास' कमांड की आवश्यकता क्यों है?
Danijel

मैक OSX पर .bash_profile से "स्क्रिप्ट" कमांड को कॉल करने जैसा लगता है कि शेल पर कुछ अजीब प्रभाव पड़ता है। क्या आपको पता है कि यह OSX पर काम करना चाहिए?
डेनिजेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.