बैश का इतिहास कहाँ संग्रहीत है?


95

अगर मैं दौड़ता हूं history, तो मैं अपनी नवीनतम निष्पादित कमांड देख सकता हूं।

लेकिन अगर मैं tail -f $HISTFILEया tail -f ~/.bash_history, वे सूचीबद्ध नहीं हैं।

क्या फ़ाइल लॉक हो जाती है, क्या कोई अस्थायी स्थान या कुछ समान है?

जवाबों:


117

बैश स्मृति में आंतरिक रूप से चलने के दौरान कमांड की सूची को बनाए रखता है। वे .bash_historyबाहर निकलने पर लिखे गए हैं :

जब एक इंटरैक्टिव शेल बाहर निकलता है, तो अंतिम $ HISTSIZE लाइनों को इतिहास सूची से $ HISTFILE नाम की फ़ाइल में कॉपी किया जाता है

यदि आप कमांड इतिहास को लिखने के लिए मजबूर करना चाहते हैं, तो आप history -aकमांड का उपयोग कर सकते हैं , जो होगा:

नई इतिहास लाइनों (वर्तमान बैश सत्र की शुरुआत के बाद से दर्ज की गई इतिहास लाइनें) को इतिहास फ़ाइल में जोड़ें।

एक -wविकल्प भी है :

इतिहास फ़ाइल में वर्तमान इतिहास लिखें।

जो आपके इतिहास के उपयोग के आधार पर आपको अधिक सूट कर सकता है।

यदि आप यह सुनिश्चित करना चाहते हैं कि वे हमेशा तुरंत लिखे जाएं, तो आप उस आदेश को अपने PROMPT_COMMANDचर में डाल सकते हैं :

export PROMPT_COMMAND='history -a'

साइड नोट: यदि आपकी .bash_historyफ़ाइल गलती से रूट के स्वामित्व में हो जाती है, तो चीजें काम करना बंद कर देती हैं। उस स्थिति में, स्वामित्व की जांच करें और sudoयदि आवश्यक हो तो स्वामित्व को ठीक करने के लिए उपयोग करें।
torek

13

(जवाब नहीं लेकिन मैं टिप्पणी नहीं जोड़ सकता)

यदि आप जाँच कर रहे हैं .bash_historyक्योंकि आप केवल एक विशिष्ट कमांड को हटाना चाहते हैं (जैसे स्पष्ट रूप से पासवर्ड युक्त), तो आप सीधे मेमोरी में प्रविष्टि को हटा सकते हैं history -d <entry_id>

उदाहरण के लिए, जैसे आउटपुट को दबाना:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

और आप exportलाइन को शुद्ध करना चाहते हैं , आप बस इसे प्राप्त कर सकते हैं:

history -d 928

11

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

यदि आप प्रत्येक कमांड के बाद सहेजने के लिए कॉन्फ़िगर करते हैं, तो एक ही समय में कई बैश चलने के निहितार्थों पर विचार करें। (कमांड लाइन्स को इंटरलेय किया जाएगा)


2
आपके उत्तर की शुरुआत इसे ध्वनि के रूप में करती है जैसे कि इतिहास को किसी फ़ाइल में संग्रहीत किया जाता है जिसे bash कहा जाता है, या यहां तक ​​कि पूर्व में भी bash। मैं लिखूंगा "यह bashस्मृति में संग्रहीत है , ..."
एंथन

यह वास्तव में बेहतर है
एंथन

5

आपके सत्र के सक्रिय होने पर मेमोरी (RAM) में कमांड्स सहेजे जाते हैं। जैसे ही आप शेल को बंद करते हैं, कमांड लिस्ट को .bash_historyशटडाउन से पहले लिखा जाता है ।

इस प्रकार, आप वर्तमान सत्र का इतिहास नहीं देखेंगे .bash_history


4
इतिहास फ़ाइल को bashसमाप्ति पर अपडेट किया जाता है, जो रिबूट करने का मतलब नहीं है (विशेषकर ग्राफिकल वातावरण में जहां आप अपनी इच्छानुसार टर्मिनलों को खोल और बंद कर सकते हैं)।
जॉन डब्ल्यूएच स्मिथ

4

दौड़ते समय, इतिहास को केवल मेमोरी में रखा जाता है (डिफ़ॉल्ट रूप से) यदि:

  • -ओ इतिहास (एक सेट Hमें echo "$-") निर्धारित है।
  • HISTSIZE और नहीं है0
  • HISTIGNORE नहीं है *(या कुछ अन्य बहुत प्रतिबंधात्मक पैटर्न)।

यदि उपरोक्त में से कोई भी विफल हो जाता है, तो कोई भी इतिहास स्मृति में संग्रहीत नहीं होता है और परिणामस्वरूप कोई भी इतिहास डिस्क पर नहीं लिखा जा सकता है या नहीं लिखा जाएगा।

स्मृति में इतिहास डिस्क के लिए लिखा है यदि:

  • HISTFILESIZE 0 नहीं है और
  • HISTFILE परेशान नहीं है।

लेकिन केवल तभी जब शेल बाहर निकलता है या यदि कमांड history -a(एपेंड) या history -w(राइट) निष्पादित होता है।

डिस्क पर तत्काल लिखने के लिए आप चर का उपयोग कर सकते हैं:

 PROMPT_COMMAND='history -a'

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

या:

 PROMPT_COMMAND='history -w'

स्मृति से सूची के साथ इतिहास में इतिहास को अधिलेखित करने के लिए।

तो, आप मेमोरी में इतिहास से एक कमांड हटा सकते हैं:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

और इसे अंतिम कमांड के साथ डिस्क पर लिखें:

 history -w    # with `shopt -u histappend` unset

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