बैश HISTSIZE बनाम HISTFILESIZE?


174

HISTSIZEबनाम क्या अंतर है HISTFILESIZE?

वे डिफ़ॉल्ट 500 लाइनों से परे बैश इतिहास का विस्तार करने के लिए उपयोग किए जाते हैं।

ऐसा लगता है कि यहाँ स्पष्टता का अभाव है और अन्य मंचों पर इस बात की आवश्यकता है कि इन दोनों की आवश्यकता क्यों है। ( उदाहरण 1 , उदाहरण 2 , उदाहरण 3 )।

जवाबों:


289

संक्षिप्त जवाब:

HISTSIZE आपके बैश सत्र के चालू रहने के दौरान इतिहास की सूची में स्मृति में संग्रहीत लाइनों या आदेशों की संख्या होती है।

HISTFILESIZE एक सत्र के स्टार्टअप समय में (ए) को इतिहास फ़ाइल में उन पंक्तियों या आदेशों की संख्या की अनुमति है, और (बी) भविष्य के सत्रों में उपयोग के लिए आपके बैश सत्र के अंत में इतिहास फ़ाइल में संग्रहीत हैं।

स्मृति में file: पर - और list: के बीच अंतर को नोटिस करें ।

लंबा जवाब:

उपरोक्त सभी जानकारी + कुछ उदाहरण:

उदाहरण 1 : HISTFILESIZE=10औरHISTSIZE=10

  1. आप अपना सत्र शुरू करें।
  2. आपका इतिहास (वह फ़ाइल जो आपके बैश कमांड हिस्ट्री को स्टोर करता है), HISTFILESIZE = 10 लाइनों को समाहित करने के लिए छोटा है।
  3. आप 50 लाइन लिखते हैं।
  4. आपके 50 कमांड के अंत में, केवल 41 से 50 कमांड आपके इतिहास की सूची में हैं, जिनका आकार HISTSIZE = 10 द्वारा निर्धारित किया जाता है।
  5. आप अपना सत्र समाप्त करें।
  6. संभालने histappendमें सक्षम नहीं है, 41 से 50 कमांड आपके HISTFILE में सहेजे गए हैं जो अब 10 कमांड हैं जो इसे शुरुआत में आयोजित किए गए हैं और साथ ही 10 नए लिखित कमांड।
  7. आपके संकेत को HISTFILESIZE = 10 लाइनों से युक्त किया गया है।
  8. अब आपके पास अपने इतिहास में 10 कमांड हैं - अंतिम 10 जो आपने अभी-अभी समाप्त हुए सत्र में टाइप किया है।
  9. जब आप एक नया सत्र शुरू करते हैं, तो आप HISTFILESIZE = 10 के इतिहास पर 1 से शुरू करते हैं।

उदाहरण 2 : HISTFILESIZE=10औरHISTSIZE=5

  1. आप अपना सत्र शुरू करें।
  2. आपका इतिहास (वह फ़ाइल जो आपके बैश कमांड इतिहास को संग्रहीत करता है), को सबसे अधिक HISTFILESIZE = 10 लाइनों में समाहित किया गया है।
  3. आप 50 लाइन लिखते हैं।
  4. आपके 50 कमांड के अंत में, केवल 46 से 50 कमांड आपके इतिहास की सूची में हैं, जिनका आकार HISTSIZE = 5 द्वारा निर्धारित किया जाता है।
  5. आप अपना सत्र समाप्त करें।
  6. संभालने histappendमें सक्षम नहीं है, 46 से 50 कमांड आपके HISTFILE में सहेजे गए हैं जो अब 10 कमांड हैं जो इसे शुरुआत में आयोजित किए गए हैं और साथ ही 5 नए लिखित कमांड।
  7. आपके संकेत को HISTFILESIZE = 10 लाइनों से युक्त किया गया है।
  8. अब आपके पास अपने इतिहास में 10 कमांड हैं - पिछले सत्र से 5 और पिछले 5 जो आपने अभी-अभी समाप्त हुए सत्र में टाइप किया है।
  9. जब आप एक नया सत्र शुरू करते हैं, तो आप HISTFILESIZE = 10 के इतिहास पर 1 से शुरू करते हैं।

उदाहरण 3 : HISTFILESIZE=5औरHISTSIZE=10

  1. आप अपना सत्र शुरू करें।
  2. आपका इतिहास (वह फ़ाइल जो आपके बैश कमांड इतिहास को संग्रहीत करता है), को सबसे अधिक HISTFILESIZE = 5 लाइनों में समाहित किया गया है।
  3. आप 50 लाइन लिखते हैं।
  4. आपके 50 कमांड के अंत में, केवल 41 से 50 कमांड आपके इतिहास की सूची में हैं, जिनका आकार HISTSIZE = 10 द्वारा निर्धारित किया जाता है।
  5. आप अपना सत्र समाप्त करें।
  6. यह मानते हुए histappendकि सक्षम नहीं है, 41 से 50 कमांड आपके HISTFILE में सहेजे गए हैं जो अब 5 कमांड्स हैं जो इसे शुरुआत में आयोजित किए गए हैं और साथ ही 10 नए लिखित कमांड।
  7. आपके संकेत को HISTFILESIZE = 5 लाइनों से युक्त किया गया है।
  8. अब आपके पास अपने इतिहास में 5 कमांड हैं - अंतिम 5 जो आपने अभी-अभी समाप्त हुए सत्र में टाइप किया है।
  9. जब आप एक नया सत्र शुरू करते हैं, तो आप HISTFILESIZE = 5 के संकेत के साथ चरण 1 से शुरू करते हैं।

Elixir_sinari से जानकारी :

जैसे ही आप कमांड टाइप करते हैं, इतिहास "फाइल" अपडेट नहीं होता है। आदेश एक "सूची" में अलग से संग्रहीत (इतिहास कमांड द्वारा पहुँचा)। इन संग्रहीत आदेशों की संख्या HISTSIZE मान द्वारा नियंत्रित की जाती है। जब शेल (इंटरेक्टिव) बाहर निकलता है, तो अंतिम HISTSIZE लाइनों को उस सूची से $ HISTFILE में कॉपी / जोड़ा जाता है। यदि HISTFILESIZE सेट है, तो इस ऑपरेशन के बाद, यह सुनिश्चित किया जाता है कि $ HISTFILESIZE लाइनें (नवीनतम) $ HISTFILE में मौजूद हैं। और जब शेल शुरू होता है, तो "सूची" को $ HISTFILE से अधिकतम $ HISTSIZE कमांड तक आरंभ किया जाता है।

और man bashपेज से:

HISTSIZE चर का मान इतिहास सूची में सहेजने के लिए कमांड की संख्या के रूप में उपयोग किया जाता है। अंतिम HISTSIZE कमांड (डिफ़ॉल्ट 500) का पाठ सहेजा गया है। (...)

स्टार्टअप पर, इतिहास को HISTFILE (डिफ़ॉल्ट ~ / .bash_history) द्वारा नामित फ़ाइल से आरंभ किया गया है। यदि आवश्यक हो, तो HISTFILESIZE के मान द्वारा निर्दिष्ट पंक्तियों की संख्या से अधिक नहीं होने के लिए, HISTFILE के मान द्वारा नामित फ़ाइल को छोटा किया गया है। (...) जब एक इंटरैक्टिव शेल बाहर निकलता है, तो अंतिम $ HISTSIZE लाइनों को इतिहास सूची से $ HISTFILE में कॉपी किया जाता है। यदि हिस्टैपेंड शेल विकल्प सक्षम किया गया है (नीचे शेल बिल्डिन के नीचे शॉप्ट का विवरण देखें), लाइनें इतिहास फ़ाइल में संलग्न हैं, अन्यथा इतिहास फ़ाइल ओवरराइट की गई है। यदि HISTFILE परेशान है, या यदि इतिहास फ़ाइल अपरिहार्य है, तो इतिहास सहेजा नहीं गया है। (...) इतिहास को सहेजने के बाद, इतिहास फ़ाइल को HISTFILESIZE लाइनों से अधिक नहीं रखने के लिए छोटा किया गया है। यदि HISTFILESIZE सेट नहीं है,


27
+1 यह जवाब प्रभावशाली है! थोड़ा बहुत हालांकि, मुझे लगता है। अधिकांश लोग इसके अंत तक नहीं पहुंचेंगे। मुझे लगता है कि आपको इसे संक्षेप में प्रस्तुत करने पर विचार करना चाहिए
slezica

22
@slezica मैं आपकी टिप्पणी के दूसरे भाग से असहमत हूं: मैं इसके अंत तक पहुंच गया और मैं कह सकता हूं कि उत्तर में हर जानकारी उपयोगी है। तथ्य यह है कि कुछ लोगों को कुछ लाइनों को पढ़ने के लिए बहुत आलसी हैं, दूसरों के लिए उपयोगी जानकारी को हटाने का औचित्य नहीं होना चाहिए।
बैस्टियन

1
@ बस्तियन ने माना कि आप एक बुलेट पॉइंट पार्सर हैं, आपको इसे पढ़ने में कोई कठिनाई नहीं होगी।
पिथिकोस

6
देखिए, मेरी हार्ड ड्राइव 1 टीबी और काफी हद तक खाली है, और मेरे पास बेकार सीपीयू साइकल और रैम है, और मैं यथोचित संभव के रूप में ज्यादा बैश इतिहास को बचाना चाहता हूं - इसलिए जब मुझे उस बेवकूफ कमांड को देखने की जरूरत है तो मैं ' t दो साल में चला, मुझे पता है कि यह मेरे बैश इतिहास में है। इसे और अधिक ठोस बनाने के लिए, मान लें कि 50 एमबी तक बैश का इतिहास है। आप किन मूल्यों की सलाह देते हैं?
CivFan

2
@ मैथ्यू सॉरी, यह नहीं पता!

6

Arturomp ने जो कहा है उसके शीर्ष पर निर्माण करना और इसे थोड़ा स्पष्ट करने के प्रयास में।

मान लें कि आपके पास 2000-कुछ लंबा इतिहास है ..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

आप जो दिखाया गया है उसे काट सकते हैं HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

अब, चाहे आप कितने भी कमांड टाइप करें, केवल अंतिम 5 दर्ज किया जाएगा।

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

हम स्पष्ट रूप से देख सकते हैं कि हमारा पहला कमांड ("एबीसी") इतिहास में नहीं है क्योंकि केवल अंतिम 5 कमांड दर्ज किए गए थे।

अब, कुल इतिहास एक फ़ाइल ( .bash_history) में संग्रहीत किया जाता है और आप बदल सकते हैं कि यह फ़ाइल कितने समय के लिए मिलती है HISTFILESIZE। उदाहरण के लिए 2033 HISTFILESIZE, मेरे मामले में मेरे पास यह होगा:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
आप क्या मूल्यों की सिफारिश करेंगे अगर मैं चाहता हूँ सब से इतिहास सब , बैश इतिहास में सहेजे जाने की समवर्ती टर्मिनलों हमेशा के लिए ? दूसरे शब्दों में, सब कुछ, हमेशा, और कभी भी कुछ भी न हटाएं।
CivFan

10
@ शिवफल: सेट HISTSIZE=-1और HISTFILESIZE=-1
एम। डडले

2
यह गलत है। इसे -1 पर सेट करने से सबकुछ साफ हो जाएगा।
ब्रेंडन बायर

3
@BrendanByrd bashमैन पेज कहता है: Non-numeric values and numeric values less than zero inhibit truncationलेकिन तब मेरे पास यह जाँचने का साहस नहीं था कि क्या यह सच है क्योंकि मैं अपने इतिहास को ढीला नहीं करना चाहता हूं :-)
सेबमा

3
@SebMa मैं लिए अपनी सेटिंग्स बदल HISTSIZE='INFINITY'और HISTFILESIZE='ANDBEYOND'। चूंकि वे गैर-संख्यात्मक हैं, इसलिए वे सब कुछ बचाते हैं। पारितोषिक के लिए धन्यवाद!
कॉनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.