कई सत्र चलाते समय अजीब व्यवहार को रोकें


15

जब मैं कई टर्मिनल विंडो का उपयोग करता हूं तो कमांड लाइन इतिहास कैसे संग्रहीत किया जाता है? मुझे पता है कि यह संग्रहित है, .bash_historyलेकिन अगर मैं नई विंडो खोलता हूं तो मैं इस बात पर तर्क नहीं देख सकता कि किस इतिहास का उपयोग किया जाता है। यह लगभग एक अर्थ में nondeterministic महसूस करता है कि मुझे कभी नहीं पता कि मैं क्या कमांड देखूंगा अगर मैं नई विंडो में तीर का उपयोग करने का प्रयास करता हूं।

क्या कोई इसे समझा सकता है?

क्या इतिहास को इस तरह से नियंत्रित करने का एक तरीका है कि मैं विशेष विंडो से इतिहास का पुन: उपयोग कर सकता हूं?

जवाबों:


14

बैश इतिहास के व्यवहार को समझने के लिए सबसे पहले आपको निम्नलिखित बातों को जानना होगा:

  1. इतिहास फ़ाइल में इतिहास है।
  2. बैश प्रक्रिया की याद में इतिहास है।
  3. एक बैश प्रक्रिया की स्मृति में इतिहास किसी अन्य बैश प्रक्रिया की स्मृति में इतिहास के साथ समन्वयित नहीं होता है।
  4. बैश प्रक्रिया की स्मृति में इतिहास फ़ाइल में इतिहास के साथ समन्वयित नहीं किया जाता है, जब तक कि स्पष्ट रूप से या किसी विशिष्ट घटना के दौरान (नीचे देखें) नहीं पूछा जाता है।

डिफ़ॉल्ट सेटिंग्स का उपयोग करते हुए, इतिहास के संबंध में एक बैश सत्र का जीवनचक्र इस प्रकार है:

  1. स्टार्टअप बैश के दौरान इतिहास फ़ाइल पढ़ेगा। इतिहास फ़ाइल की सामग्री अब बैश प्रक्रिया की स्मृति में है।
  2. सामान्य उपयोग के दौरान केवल स्मृति में इतिहास को हेरफेर किया जाता है।
  3. शटडाउन के दौरान मेमोरी में इतिहास को इतिहास फ़ाइल में लिखा जाता है, इतिहास फ़ाइल की किसी भी पिछली सामग्री को अधिलेखित करना।

आपके द्वारा देखा गया प्रतीत होता है कि अप्रस्तुत व्यवहार ज्यादातर इसलिए है क्योंकि इतिहास फ़ाइल की सामग्री हमेशा अंतिम बंद बैश सत्र का इतिहास होती है, और बैश केवल स्टार्टअप के दौरान इतिहास फ़ाइल पढ़ता है।

स्टार्टअप और शटडाउन प्रक्रिया के अधिक विस्तृत विवरण के लिए बैश मैनुअल पढ़ें ।

ध्यान दें कि डिफ़ॉल्ट सेटिंग्स के साथ मेरा मतलब है कि bash से डिफ़ॉल्ट सेटिंग्स। आपके वितरण ने एक .bashrc(या /etc/bash.bashrc) प्रदान किया है जो इस व्यवहार को बदल देता है।

शेल विकल्प को सक्षम करके histappendआप इतिहास फ़ाइल को अधिलेखित करने के बजाय एपेंड को बता सकते हैं। आप histappendकमांड का उपयोग करके सक्षम कर सकते हैं shopt -s histappend। इस विकल्प को हमेशा सक्षम करने के लिए आपको कमांड को अपनी .bashrc(या अन्य इनिशियलाइज़ेशन फ़ाइल) में रखना होगा । बैश मैनुअलshopt में कमांड के बारे में और पढ़ें

ध्यान दें कि सक्षम करने histappendसे बहुत प्रतीत नहीं होता है कि निंदनीय व्यवहार कम हो जाएगा। ऐसा इसलिए है क्योंकि प्रत्येक बैश सत्र में अभी भी स्मृति में अपना इतिहास है। यह संभव है कि ज्यादातर सिंक्रनाइज़ बैश इतिहास हो। एक गाइड है कि स्टैक ओवरफ्लो पर एक थ्रेड में ज्यादातर सिंक किए गए इतिहास के लिए हर बैश प्रक्रिया को कैसे प्राप्त किया जाए ।

अंतर्निहित कमांड का उपयोग करके historyआप स्पष्ट रूप से इतिहास को फ़ाइल से मेमोरी तक, या मेमोरी से फ़ाइल में लिखने के लिए पढ़ सकते हैं। उदाहरण के लिए: history -rफ़ाइल की सामग्री को पढ़ेंगे और इसे मेमोरी में इतिहास में जोड़ देंगे। history -wपिछली सामग्री को अधिलेखित करने के लिए मेमोरी से फ़ाइल में वर्तमान इतिहास लिखेंगे। यह मूल रूप से बंद के दौरान क्या होता है। बैश मैनुअलhistory में कमांड के बारे में और पढ़ें

पूर्णता के लिए यहां आंतरिक चर की एक सूची है जो इतिहास व्यवहार को संशोधित करती है:

  • HISTFILE: से पढ़ने के लिए और इतिहास लिखने के लिए फ़ाइल।
  • HISTFILESIZE: इतिहास फ़ाइल के लिए अधिकतम पंक्ति गणना।
  • HISTSIZE: स्मृति में इतिहास के लिए अधिकतम पंक्ति गणना।
  • HISTCONTROL, HISTIGNORE, HISTTIMEFORMAT: इस चर्चा के लिए प्रासंगिक नहीं। विवरण के लिए बैश मैनुअल पढ़ें ।

अच्छे खर्च। आपने शटडाउन का उल्लेख किया, लेकिन टर्मिनल सत्र को मारने के बारे में क्या? सत्र लॉगआउट के माध्यम से या UI के माध्यम से या नेटवर्क कनेक्शन में गिरावट जैसे कुछ अन्य माध्यमों से मारा जा सकता है। यदि पूरी इतिहास फ़ाइल को बदल दिया गया है और आपके पास कई सत्र हैं, तो क्या आप कह रहे हैं कि पिछले बंद से इतिहास का उपयोग इतिहास फ़ाइल में किया जाएगा? यह गैर निर्धारक व्यवहार की व्याख्या कर सकता है।
एलेक्स गितलमैन

जीवनचक्र बिंदु (3) सही नहीं है। ऐसा लगता है कि केवल पहला बैश सत्र ही इतिहास की फाइल को लिखेगा। टेस्ट: क्रम में 2 सत्र खोलें- a, b। बी में 'इको हेलो' करें । फिर बी में बाहर निकलें । फिर एक नया सत्र खोलें c । इस सत्र में यह इतिहास में गूंज नहीं होगा।
user606723 19

@AlexGitelman: यदि कोई बैश प्रक्रिया मारी जाती है, तो उसके पास इतिहास फ़ाइल को अधिलेखित करने का मौका नहीं होगा। और हां, पिछले बंद सत्र का इतिहास वही है जो इतिहास की फाइल में होगा।
lesmana 8

@ user606723: बिंदु 3 सही है। बैश मैनुअल पढ़ें। एक न्यूनतम .bashrcफ़ाइल का उपयोग करके फिर से प्रयोग करें । ध्यान दें कि हो सकता है कि आपके वितरण ने कुछ सेटिंग बदल दी हों /etc/bash.bashrc। विशेष रूप से शेल विकल्प के लिए जाँच करें histappend
lesmana

2

http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

आप हेरफेर करने में सक्षम हो सकते हैं कि इतिहास फ़ाइल को टर्मिनलों में से एक के साथ कैसे लिखा जाता है, अर्थात, "इतिहास-ए" या "इतिहास -w" को उस टर्मिनल में निष्पादित करें जिसे आप इतिहास को सहेजना चाहते हैं, और फिर "इतिहास -r" में अन्य टर्मिनलों। निर्भर करता है कि आपकी क्या करने की इच्छा है।


0

AFAIK, bash कमांड्स SSH सत्र समाप्त होने के बाद सहेजे जाते हैं। इसलिए, जब कोई सत्र असामान्य रूप से (उदाहरण के लिए, नेटवर्क विफलता के कारण) समाप्त हो जाता है, तो कमांड सहेजे नहीं जाते हैं। मैं यहाँ SSH सत्रों के बारे में बात कर रहा हूँ। स्थानीय टर्मिनल समान दृष्टिकोण का उपयोग कर सकते हैं।

एक ही समय में कई सत्र खोलते समय, एक सत्र में टाइप की गई कमांड को दूसरे पर नहीं देखा जाता है जबकि वे दोनों सक्रिय हैं। हालाँकि, आप इन आदेशों को देखेंगे जब आप अपना सत्र समाप्त करेंगे तो इसे पुनः खोलें।


यह वह व्यवहार नहीं है जिसे मैंने अनुभव किया है। मैं एक त्वरित परीक्षण करके इसकी पुष्टि कर सकता हूं जहां मैं एक ssh सत्र खोलता हूं, एक कमांड करता हूं, और एक सुंदर निकास करता हूं। इस मामले में, मेरे पास एक और पहले से सक्रिय सत्र था। इस पहले से मौजूद बैश सत्र में, मैं .bash_history की जांच करता हूं और कुछ भी रिकॉर्ड नहीं करता। मुझे लगता है कि संभावना है कि पहला बैश सत्र चल रहा है जो केवल .bash_history के लिए रिकॉर्डिंग समाप्त करता है।
user606723 19

आपके सत्र को समाप्त करने से वर्तमान में चल रहे सत्र प्रभावित नहीं होंगे, लेकिन यह नए सत्रों को प्रभावित करेगा!
खालिद

क्या होगा अगर यह एसएसएच नहीं है लेकिन गनोम टर्मिनल विंडो है जो मैं यूआई के माध्यम से बंद करता हूं?
एलेक्स गिटेलमैन

इसे सत्यापित करने की आवश्यकता है। वर्तमान में, मेरे पास Gnome टर्मिनल तक पहुंच नहीं है!
खालिद

@ खालिद, इसका परीक्षण किया, नए सत्रों को प्रभावित नहीं करता है। (मैंने किसी भी रास्ते से पहले .bash_history की जाँच की, जहां bash को नए सत्रों के लिए कमांड हिस्ट्री मिलती है, मुझे ऐसा लगता है कि यह काम नहीं करेगा, लेकिन मैं आपको वैसे भी नम्र करता हूं।)
user606723
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.