.Bash_history फ़ाइल की सामग्री कितने समय तक चलती है?


11

मैं अपनी bash_historyफ़ाइल की सामग्री को कैसे संशोधित कर सकता हूं ? इतिहास कितने समय तक चलता है, इसका क्या मूल्य या चर नियंत्रित करते हैं? क्या कोई अन्य चीजें हैं जो मैं अपने BASH इतिहास का बेहतर नियंत्रण प्रदान करने के लिए बदल सकता हूं ??



2
मुझे विश्वास नहीं है कि यह फ़ाइल समय की लंबाई से नियंत्रित होती है, बल्कि फ़ाइल के अंतिम आकार पर। यहाँ देखें: क्या इतिहास की सूची के आकार को 5000 से अधिक लाइनों के लिए सेट करने का कोई तरीका है? । तो एन.वी. चर HISTSIZEऔर HISTFILESIZEएकमात्र नियंत्रण सतह हैं जिन्हें आपको नियंत्रित करना है कि इतिहास कितना बनाए रखा गया है।
SLM

जवाबों:


12

इतिहास आकार को नियंत्रित करने वाले दो चर हैं:

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

तथा

HISTSIZE कमांड इतिहास में याद रखने के लिए कमांड की संख्या (नीचे देखें इतिहास)। यदि मान 0 है, तो इतिहास सूची में आदेश सहेजे नहीं जाते हैं। इतिहास सूची में सहेजे जाने वाले हर आदेश में शून्य मान शून्य से कम है (इसकी कोई सीमा नहीं है)। शेल किसी भी स्टार्टअप फ़ाइलों को पढ़ने के बाद डिफ़ॉल्ट मान को 500 पर सेट करता है।

ये दो चर आपको अपने इतिहास के व्यवहार को नियंत्रित करने की अनुमति देते हैं। मूल रूप से, HISTSIZEआपके वर्तमान सत्र के दौरान सहेजे गए आदेशों की संख्या है और उन आदेशों HISTFILESIZEकी संख्या है जिन्हें सत्रों में याद किया जाएगा। इसलिए, उदाहरण के लिए:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

ऊपर दिए गए उदाहरण में, क्योंकि HISTSIZE10 पर सेट है, history10 कमांड की सूची देता है। हालाँकि, यदि आप लॉग आउट करते हैं और फिर वापस लॉग इन करते हैं, historyतो केवल 5 कमांड वापस आएंगे क्योंकि 5 HISTFILESIZEपर सेट किया गया है। ऐसा इसलिए है, क्योंकि जब आप अपना सत्र समाप्त कर लेते हैं, तो HISTFILESIZEआपके इतिहास की आपकी पंक्तियाँ आपकी इतिहास फ़ाइल ( ~/.bash_historyडिफ़ॉल्ट रूप से लेकिन नियंत्रित) द्वारा बच जाती हैं HISTFILE)। दूसरे शब्दों में, कमांड्स को HISTFILEतब तक जोड़ा जाता है जब तक कि वह $HISTFILESIZEकिस बिंदु पर लाइनों तक नहीं पहुंच जाता है, प्रत्येक बाद की लाइन जोड़ी जाने का मतलब है कि फ़ाइल का पहला कमांड हटा दिया जाएगा।

आप इन चरों के मानों को अपने ~/.profile(या ~/.bash_profileयदि वह फ़ाइल मौजूद है) सेट कर सकते हैं । उन्हें अपने ~/.bashrcपहले में सेट न करें क्योंकि उनका कोई व्यवसाय वहां सेट नहीं किया जा रहा है और दूसरी बात यह है कि इससे आपको लॉगिन बनाम गैर-लॉगिन गोले में अलग-अलग व्यवहार करना पड़ेगा, जिससे अन्य समस्याएं हो सकती हैं ।

अन्य उपयोगी चर जो आपको अपने इतिहास के व्यवहार को ठीक करने की अनुमति देते हैं:

  • HISTIGNORE: यह आपको कुछ सामान्य आदेशों की अनदेखी करने की अनुमति देता है जो कि शायद ही कभी रुचि के हों। उदाहरण के लिए, आप सेट कर सकते हैं:

    export HISTIGNORE="pwd:df:du"

    यही कारण है कि किसी भी आदेश के साथ शुरू कारण होगा pwd, dfया duनजरअंदाज कर दिया और अपने इतिहास में सहेजा नहीं।

  • HISTCONTROL: यह आपको यह चुनने देता है कि इतिहास कैसे काम करता है। व्यक्तिगत रूप से, मैं इसे HISTCONTROL=ignoredupsकेवल एक बार डुप्लिकेटेड कमांड को बचाने के लिए इसे सेट करता हूं । अन्य विकल्प ignorespaceव्हॉट्सएप से शुरू होने वाली कमांड्स को नजरअंदाज करना है, और erasedupsइससे पिछली सभी लाइनें जो वर्तमान लाइन से मेल खाती हैं, उस लाइन को सहेजने से पहले इतिहास सूची से हटा दिया जाता है। ignorebothइग्नोरस्पेस और इग्नोरडअप के लिए आशुलिपि है।

  • HISTTIMEFORMAT: यह आपको इतिहास फ़ाइल का समय प्रारूप सेट करने की अनुमति देता है। पांड्या का जवाब देखें या man bashविवरण के लिए पढ़ें ।


आगे की अच्छी ट्यूनिंग के लिए, आपके पास:

  • histappendबैश विकल्प। इसे shopt -s histappendउस कमांड को चलाकर या अपने द्वारा जोड़कर सेट किया जा सकता है ~/.bashrc। यदि यह विकल्प सेट है

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

    यह बहुत उपयोगी है क्योंकि यह आपको विभिन्न सत्रों के इतिहास को संयोजित करने की अनुमति देता है (उदाहरण के लिए विभिन्न टर्मिनलों पर विचार करें)।

  • historyआदेश दो उपयोगी विकल्प हैं:

    • history -a : अंतिम कमांड को इतिहास फ़ाइल में स्वचालित रूप से लिखे जाने का कारण बनता है

    • history -r : वर्तमान सत्र में इतिहास फ़ाइल आयात करता है।

    उदाहरण के लिए, आप इन दोनों आदेशों को अपने साथ जोड़ सकते हैं PROMPT_COMMAND(जो हर बार आपके शेल को निष्पादित करने के लिए संकेत देता है, इसलिए जब भी आप एक नया शेल शुरू करते हैं और प्रत्येक कमांड के बाद आप इसमें चलते हैं):

    export PROMPT_COMMAND='history -a;history -r;'

    संयुक्त, वे यह सुनिश्चित करते हैं कि आपके द्वारा खोला गया कोई भी नया टर्मिनल तुरंत किसी अन्य शेल सत्र के इतिहास को आयात करेगा। परिणाम सभी टर्मिनलों / शेल सत्रों में एक सामान्य इतिहास है।


2

इतिहास फ़ाइल का डिफ़ॉल्ट आकार 500 लाइनें है। एक बार .bash_history फ़ाइल 500 लाइनों तक पहुंच जाती है, तो शुरुआती प्रविष्टियां नई लाइनों के लिए जगह बनाने के लिए समाप्त हो जाती हैं, जैसे कि FIFO में। आप इसे चर के मान को बदलकर बदल सकते हैं HISTFILESIZEजो डिफ़ॉल्ट रूप से मूल्य 500 है।

HISTFILESIZE=10000अपने .bashrc में डालने से उन पंक्तियों की संख्या बढ़ जाएगी जो इतिहास फ़ाइल को 10000 तक रोक सकती हैं, जिससे उसकी सामग्री का जीवन बढ़ जाता है।


2
नोट: यदि आप HISTSIZEसीमा बढ़ाते हैं , तो HISTFILEभी बदलने पर विचार करें । यदि आप चलाते bash --norc HISTSIZEहैं तो डिफ़ॉल्ट मूल्य पर वापस चले जाएंगे, HISTFILEबाहर निकलने पर ट्रंकटेटिंग।
14

धन्यवाद, @llua इसी तरह, यदि आपके सिस्टम ने /etc/bash.bashrcएक HISTFILESIZE(या हो सकता है HISTSIZE; मैंने जांच नहीं की है), तो बैश .bash_historyउस बिंदु पर छंटनी करने के लिए प्रकट होता है जो इसे पढ़ता है /etc/bash.bashrc(या कम से कम किसी बिंदु पर आपकी नई बैश इनिट फ़ाइलों में सेट होने से पहले)। इससे बचने के लिए, फिर से, अपना खुद का सेट करें HISTFILEताकि आपका वास्तविक इतिहास वहां जाए और उस .bash_historyफाइल में न जाए जो बैश ट्रंक कर रहा है।
क्रिस पोविर्क

(लेकिन ऐसा मत exportकरो, क्योंकि ऐसा करने से यह किसी भी बच्चे के गोले को दिखाई देगा, जो तब इसके बजाय इसे छोटा कर सकता है .bash_history!)
क्रिस पोवेरिक

0

बैश इतिहास केman bash बारे में अधिक जानकारी के लिए पढ़ें जैसे:

HISTCONTROL
       इतिहास सूची में आदेशों को कैसे सहेजा जाता है इसे नियंत्रित करने वाले मूल्यों की एक बृहदान्त्र-पृथक सूची।
       यदि मानों की सूची में इग्नोरस्पेस शामिल हैं, तो वे रेखाएं जो अंतरिक्ष वर्ण से शुरू होती हैं
       इतिहास सूची में सहेजा नहीं गया है। अनदेखा किए गए मान का कारण पिछली से मेल खाती लाइनें हैं
       इतिहास प्रविष्टि को सहेजा नहीं जाना चाहिए। इग्नोरबॉथ का एक मान इग्नोरस्पेस के लिए शॉर्टहैंड है और
       ignoredups। इरेडअप्स का मान वर्तमान लाइन से मेल खाते सभी पिछली लाइनों का कारण बनता है
       उस सूची को सहेजे जाने से पहले इतिहास सूची से हटा दिया जाए। उपरोक्त में कोई मूल्य नहीं
       सूची को नजरअंदाज किया जाता है। यदि HISTCONTROL परेशान है, या सभी लाइनों में एक मान्य मूल्य शामिल नहीं है
       इतिहास सूची में हिस्टरी के मूल्य के अधीन शेल पार्सर द्वारा पढ़ा जाता है
       नही रे। मल्टी-लाइन कंपाउंड कमांड की दूसरी और बाद की लाइनों का परीक्षण नहीं किया जाता है,
       और HISTCONTROL के मूल्य की परवाह किए बिना इतिहास में जोड़ा जाता है।
HISTFILE
       फ़ाइल का नाम जिसमें कमांड इतिहास सहेजा गया है (नीचे इतिहास देखें)। डिफ़ॉल्ट
       मान ~ / .bash_history है। यदि कोई परेशान है, तो शेल से बाहर निकलने पर कमांड हिस्ट्री सेव नहीं होती है।
HISTFILESIZE
       इतिहास फ़ाइल में शामिल पंक्तियों की अधिकतम संख्या। जब यह चर सौंपा गया है
       मान, इतिहास फ़ाइल को काट दिया जाता है, यदि आवश्यक हो, तो उस संख्या से अधिक नहीं होना चाहिए
       सबसे पुरानी प्रविष्टियों को हटाकर लाइनों का। इतिहास फ़ाइल को इस आकार में भी छोटा किया गया है
       इसे लिखने के बाद जब एक शेल बाहर निकलता है। यदि मान 0 है, तो इतिहास फ़ाइल को छोटा कर दिया जाता है
       शून्य आकार। गैर-संख्यात्मक मान और संख्यात्मक मान शून्य से कम ट्रंकेशन को रोकते हैं। 
       शेल किसी भी स्टार्टअप फ़ाइलों को पढ़ने के बाद HISTSIZE के मान के लिए डिफ़ॉल्ट मान सेट करता है।
HISTIGNORE
       पैटर्न की एक बृहदान्त्र-पृथक सूची तय करने के लिए उपयोग की जाती है कि किस कमांड लाइन को बचाया जाना चाहिए
       इतिहास सूची। प्रत्येक पैटर्न लाइन की शुरुआत में लंगर डाले हुए है और मेल खाना चाहिए
       पूरी लाइन (कोई निहित `* संलग्न है)। प्रत्येक पैटर्न को लाइन के खिलाफ परीक्षण किया जाता है
       HISTCONTROL द्वारा निर्दिष्ट चेक लागू होने के बाद। सामान्य खोल के अलावा
       पैटर्न मिलान वर्ण, `और 'पिछले इतिहास लाइन से मेल खाते हैं। `और’ बच सकते हैं
       बैकस्लैश का उपयोग करना; मैच का प्रयास करने से पहले बैकस्लैश हटा दिया जाता है। दूसरा और
       मल्टी-लाइन कंपाउंड कमांड की बाद की लाइनों का परीक्षण नहीं किया जाता है, और इसमें जोड़ा जाता है
       इतिहास के मूल्य की परवाह किए बिना।
HISTSIZE
       कमांड इतिहास में याद रखने के लिए कमांड की संख्या (नीचे इतिहास देखें)। अगर द
       मान 0 है, कमांड इतिहास सूची में सहेजे नहीं गए हैं। शून्य से कम संख्यात्मक मान
       इतिहास सूची में सहेजे जाने वाले प्रत्येक आदेश में परिणाम (कोई सीमा नहीं है)। खोल
       किसी भी स्टार्टअप फ़ाइलों को पढ़ने के बाद डिफ़ॉल्ट मान को 500 पर सेट करता है।
HISTTIMEFORMAT
       यदि यह चर सेट किया गया है और अशक्त नहीं है, तो इसका मान स्ट्रैपटाइम के लिए एक प्रारूप स्ट्रिंग के रूप में उपयोग किया जाता है (3)
       इतिहास द्वारा प्रदर्शित प्रत्येक इतिहास प्रविष्टि के साथ जुड़े समय टिकट को मुद्रित करने के लिए
       builtin। यदि यह चर सेट किया जाता है, तो समय टिकट इतिहास फ़ाइल में लिखे जाते हैं, इसलिए वे हो सकते हैं
       शैल सत्रों में संरक्षित किया जाना। यह इतिहास टिप्पणी चरित्र का उपयोग भेद करने के लिए करता है
       अन्य इतिहास लाइनों से टाइमस्टैम्प।

विशेष रूप से HISTFILESIZEऔर HISTSIZEआप देख सकते हैं और आपकी मदद कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.