2013-02-16 17 views
14

यदि मैं screen -dmS name के साथ एक स्क्रीन सत्र शुरू करता हूं, तो मैं उस स्क्रीन सत्र के कमांड इतिहास को स्क्रिप्ट के साथ कैसे एक्सेस करूं?बैश: मैं स्क्रीन सत्र में कमांड इतिहास कैसे प्राप्त करूं?

का उपयोग करके, अंतिम निष्पादित आदेश स्क्रीन में भी दिखाई देता है।

उत्तर

4

screen आपके द्वारा टाइप किए गए आदेशों का इतिहास बनाए रखता नहीं है। आपका खोल इतिहास रख सकता है या नहीं। चूंकि आप bash का उपयोग करने लगते हैं, तो आप history कमांड का उपयोग कर सकते हैं।

screen एक इतिहास खोज की एक कच्चे सन्निकटन के लिए प्रकट होता है (यह महज एक कमांड लाइन के लिए स्क्रॉल बैक बफर खोज करता है। "इतिहास" कमांड (डिफ़ॉल्ट रूप से C-a { करने के लिए बाध्य) के तहत screen आदमी पृष्ठ देखें।

+1

क्या आपका मतलब उसी सत्र में एक अलग विंडो से है (या संभवतः एक अलग सत्र से भी)? संभवतः। इसमें लक्ष्य विंडो के स्क्रॉलबैक बफर को पार्स करना शामिल होगा। मैं प्रोग्राम के साथ उस प्रोग्राम तक पहुंचने के तरीके के बारे में जानने के लिए पर्याप्त परिचित नहीं हूं। आप इस बारे में जानकारी के लिए मैन पेज को पढ़ने का प्रयास कर सकते हैं कि यह कैसे करें। – chepner

2

जब आप exit एक टर्मिनल (या शेल) खोल, $ HISTFILE को अपने इतिहास लिखते हैं तो एक और टर्मिनल में अपने इतिहास पाने के लिए आप टाइप कर सकते हैं टर्मिनल में exit आप के इतिहास चाहते हैं और यह लिखा हो जाएगी।

cat $HISTFILE 
#or tac, less, $EDITOR, ... depending on how you want to "access" it 
+0

क्या यह केवल 'बाहर निकलें' पर लिखा गया है? – hexacyanide

+1

AFAIK, तब तक यह स्मृति में $ HISTSIZE लाइनों तक संग्रहीत किया जाता है, जब यह लिखता है कि यह इतिहास फ़ाइल को $ HISTFILESIZE लाइनों को अधिकतम – technosaurus

+0

पर रखता है, मैं 'shopt -s histappend' के बारे में भूल गया: http: //unix.stackexchange.com/प्रश्न/6501/क्यों-होगा-किसी भी-सेट-हिस्टैपेंड-इन-बैश – technosaurus

1

@technosau रस सही है। $ HISTFILE लिखा जाता है जब बैश निकलता है, इसलिए आप एक बैश सत्र से बाहर निकल सकते हैं, और एक नया प्रारंभ कर सकते हैं, और इतिहास को फ़ाइल के माध्यम से संरक्षित किया जाना चाहिए था।

लेकिन मुझे लगता है कि आपकी समस्या का समाधान करने का एक बेहतर तरीका है। बैश मैनुअल में history built-in command का विवरण शामिल है। यह आपको history -w [filename] के साथ इस इतिहास को सहेजने और history -r [filename] के साथ इतिहास को पढ़ने की अनुमति देता है। यदि आप एक फ़ाइल नाम प्रदान नहीं करते हैं, तो यह $ HISTFILE का उपयोग करेगा।

तो मैं प्रस्ताव दूंगा कि आप अपने स्क्रीन सत्र के भीतर इतिहास को एक विशिष्ट फ़ाइल (या यदि आप चाहें तो अपने डिफ़ॉल्ट $ HISTFILE) में सहेज लेंगे। फिर उस अन्य बैश सत्र में इतिहास फ़ाइल पढ़ें जिसे आप इतिहास तक पहुंचना चाहते हैं। इस तरह आपको मूल बैश सत्र से बाहर निकलने की आवश्यकता नहीं है।

21

मैं अपने सिस्टम पर डिफ़ॉल्ट बैश खोल का उपयोग करता हूं और इसलिए अन्य गोले के साथ काम नहीं कर सकता। खुद की कमान इतिहास

साथ

डिफ़ॉल्ट स्क्रीन विंडोज डिफ़ॉल्ट स्क्रीन खिड़कियों का एक सेट को खोलने के लिए प्रत्येक:

इस

ताकि प्रत्येक नई स्क्रीन विंडो का अपना आदेश इतिहास हो जाता है क्या मैं अपने ~/.screenrc फ़ाइल में है

screen -t "window 0" 0 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' 
screen -t "window 1" 1 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' 
screen -t "window 2" bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' 

सुनिश्चित न्यू विंडोज अपने स्वयं कमान इतिहास

प्राप्त करें: अपने स्वयं के आदेश इतिहास फ़ाइल के साथ, आप ~/.screenrc फ़ाइल में निम्न जोड़ सकता है

डिफ़ॉल्ट स्क्रीन सेटिंग्स का अर्थ है कि आप Ctrl+a c या Ctrl+a Ctrl+c का उपयोग कर एक नई विंडो बनाते हैं। हालांकि, उपर्युक्त के साथ आपकी ~/.screenrc फ़ाइल में, ये डिफ़ॉल्ट ~/.bash_history फ़ाइल का उपयोग करेंगे। इसे ठीक करने के लिए, हम नई विंडो बनाने के लिए कुंजी बाइंडिंग को ओवरराइट करेंगे।जब भी आप एक नए स्क्रीन विंडो बनाने

bind c screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' 
bind ^C screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' 

अब, यह वास्तव में, एक bash खोल शुरू करने है कुछ है कि वर्तमान स्क्रीन खिड़की के नंबर ($WINDOW) भी शामिल है के लिए HISTFILE पर्यावरण चर की स्थापना: अपने ~/.screenrc फाइल करने के लिए इस जोड़ें।

कमांड इतिहास फ़ाइलों को स्क्रीन सत्रों के बीच समान विंडो संख्याओं के साथ साझा किया जाएगा।

लिखें निष्पादन

सामान्य बैश व्यवहार, इतिहास केवल $HISTFILE फाइल करने के लिए लिखा है खोल/स्क्रीन विंडो से बाहर निकलने पर कर रहा है के रूप में पर $HISTFILE के लिए आदेश। हालांकि, अगर आप चाहते हैं इतिहास फ़ाइलों के लिए लिखे जाने की बाद आदेश निष्पादित किया जाता है, और इस तरह एक ही विंडो संख्या के साथ अन्य स्क्रीन सत्र के लिए तत्काल उपलब्ध आदेशों, आप अपने ~/.bashrc फाइल करने के लिए कुछ इस तरह जोड़ सकते हैं:

export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}" 
+0

यह मेरी पसंद के करीब है, लेकिन ... इसे सभी को एक इतिहास फ़ाइल में सहेजने का तरीका खोजने का प्रयास कर रहा है। 'HISTSIZE' आदि चिपकने लगते नहीं हैं अगर आप उन्हें ऊपर 'स्क्रीन' कमांड में एम्बेड करते हैं। – beroe

1

history सभी इतिहास आदेश दिखाएगा।

0

उपयोग करें: स्क्रीन एल राजधानी एल साथ यह एक फ़ाइल का नाम screenlog.0 करने के लिए टर्मिनल इनपुट और आउटपुट की एक प्रति स्टोर करेगा या यदि आप एस का उपयोग यह नाम है, लॉग फ़ाइल स्क्रीन हो जाता है नाम

+0

लेकिन ध्यान दें: यह आउटपुट के साथ-साथ इनपुट लॉग करता है। – abalter

0

मैं अपने .bashrc में अगली पंक्तियों में डाल दिया:

case "$TERM" in 
    screen) 
     declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p') 
     if [[ $SCREEN_NAME ]]; then 
      HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}" 
      declare -p HISTFILE 
     fi 
     unset SCREEN_NAME 
     ;; 
    *) 
     ;; 
esac 

मेरे डिफ़ॉल्ट .bashrc मूल रूप से 'टर्म * | rxvt *)' के साथ इस 'मामले' है मूल्य है, तो मैं सिर्फ अपने 'स्क्रीन जोड़ा इसमें भाग लें। आप नहीं इस 'मामले' है, तो आप यह जाने की बजाय अगली उपयोग कर सकते हैं:

if [[ $TERM == screen ]]; then 
    declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p') 
    if [[ $SCREEN_NAME ]]; then 
     HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}" 
     declare -p HISTFILE 
    fi 
    unset SCREEN_NAME 
fi 

और बाद मैं अपने सभी स्क्रीन के सभी खिड़की के लिए एक खुद bash_history है।

नोट: यह chroot में काम नहीं करता है!

संबंधित मुद्दे