अगर मैं दौड़ता हूं history
, तो मैं अपनी नवीनतम निष्पादित कमांड देख सकता हूं।
लेकिन अगर मैं tail -f $HISTFILE
या tail -f ~/.bash_history
, वे सूचीबद्ध नहीं हैं।
क्या फ़ाइल लॉक हो जाती है, क्या कोई अस्थायी स्थान या कुछ समान है?
अगर मैं दौड़ता हूं history
, तो मैं अपनी नवीनतम निष्पादित कमांड देख सकता हूं।
लेकिन अगर मैं tail -f $HISTFILE
या tail -f ~/.bash_history
, वे सूचीबद्ध नहीं हैं।
क्या फ़ाइल लॉक हो जाती है, क्या कोई अस्थायी स्थान या कुछ समान है?
जवाबों:
बैश स्मृति में आंतरिक रूप से चलने के दौरान कमांड की सूची को बनाए रखता है। वे .bash_history
बाहर निकलने पर लिखे गए हैं :
जब एक इंटरैक्टिव शेल बाहर निकलता है, तो अंतिम $ HISTSIZE लाइनों को इतिहास सूची से $ HISTFILE नाम की फ़ाइल में कॉपी किया जाता है
यदि आप कमांड इतिहास को लिखने के लिए मजबूर करना चाहते हैं, तो आप history -a
कमांड का उपयोग कर सकते हैं , जो होगा:
नई इतिहास लाइनों (वर्तमान बैश सत्र की शुरुआत के बाद से दर्ज की गई इतिहास लाइनें) को इतिहास फ़ाइल में जोड़ें।
एक -w
विकल्प भी है :
इतिहास फ़ाइल में वर्तमान इतिहास लिखें।
जो आपके इतिहास के उपयोग के आधार पर आपको अधिक सूट कर सकता है।
यदि आप यह सुनिश्चित करना चाहते हैं कि वे हमेशा तुरंत लिखे जाएं, तो आप उस आदेश को अपने PROMPT_COMMAND
चर में डाल सकते हैं :
export PROMPT_COMMAND='history -a'
(जवाब नहीं लेकिन मैं टिप्पणी नहीं जोड़ सकता)
यदि आप जाँच कर रहे हैं .bash_history
क्योंकि आप केवल एक विशिष्ट कमांड को हटाना चाहते हैं (जैसे स्पष्ट रूप से पासवर्ड युक्त), तो आप सीधे मेमोरी में प्रविष्टि को हटा सकते हैं history -d <entry_id>
।
उदाहरण के लिए, जैसे आउटपुट को दबाना:
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
और आप export
लाइन को शुद्ध करना चाहते हैं , आप बस इसे प्राप्त कर सकते हैं:
history -d 928
बैश इसे कार्यशील मेमोरी में रखता है, बैश बंद होने पर या प्रत्येक कमांड के बाद इसे बचाने के लिए बैश को कॉन्फ़िगर किया जा सकता है और बैश शुरू होने पर या अनुरोध पर लोड किया जा सकता है।
यदि आप प्रत्येक कमांड के बाद सहेजने के लिए कॉन्फ़िगर करते हैं, तो एक ही समय में कई बैश चलने के निहितार्थों पर विचार करें। (कमांड लाइन्स को इंटरलेय किया जाएगा)
bash
। मैं लिखूंगा "यह bash
स्मृति में संग्रहीत है , ..."
आपके सत्र के सक्रिय होने पर मेमोरी (RAM) में कमांड्स सहेजे जाते हैं। जैसे ही आप शेल को बंद करते हैं, कमांड लिस्ट को .bash_history
शटडाउन से पहले लिखा जाता है ।
इस प्रकार, आप वर्तमान सत्र का इतिहास नहीं देखेंगे .bash_history
।
bash
समाप्ति पर अपडेट किया जाता है, जो रिबूट करने का मतलब नहीं है (विशेषकर ग्राफिकल वातावरण में जहां आप अपनी इच्छानुसार टर्मिनलों को खोल और बंद कर सकते हैं)।
दौड़ते समय, इतिहास को केवल मेमोरी में रखा जाता है (डिफ़ॉल्ट रूप से) यदि:
H
में echo "$-"
) निर्धारित है।0
*
(या कुछ अन्य बहुत प्रतिबंधात्मक पैटर्न)।यदि उपरोक्त में से कोई भी विफल हो जाता है, तो कोई भी इतिहास स्मृति में संग्रहीत नहीं होता है और परिणामस्वरूप कोई भी इतिहास डिस्क पर नहीं लिखा जा सकता है या नहीं लिखा जाएगा।
स्मृति में इतिहास डिस्क के लिए लिखा है यदि:
लेकिन केवल तभी जब शेल बाहर निकलता है या यदि कमांड history -a
(एपेंड) या history -w
(राइट) निष्पादित होता है।
डिस्क पर तत्काल लिखने के लिए आप चर का उपयोग कर सकते हैं:
PROMPT_COMMAND='history -a'
जो होगा इतिहास फाइल करने के लिए इतिहास लाइनों। ये वर्तमान बैश सत्र की शुरुआत के बाद से दर्ज की गई इतिहास लाइनें हैं, लेकिन पहले से ही इतिहास फ़ाइल में संलग्न नहीं हैं।append
new
या:
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
.bash_history
फ़ाइल गलती से रूट के स्वामित्व में हो जाती है, तो चीजें काम करना बंद कर देती हैं। उस स्थिति में, स्वामित्व की जांच करें औरsudo
यदि आवश्यक हो तो स्वामित्व को ठीक करने के लिए उपयोग करें।