कैसे करें: अनलिमिटेड बैश / शेल हिस्ट्री?


83

क्या बाश में एक असीमित इतिहास को परिभाषित करने का एक तरीका है?

जवाबों:


82

इसे अपने .bashrc(Linux) या .bash_profile(MacOS) में जोड़ें:

export HISTFILESIZE=
export HISTSIZE=

वहाँ तुम जाओ, असीमित इतिहास। वर्तमान में मेरे पास 27000 प्रविष्टियाँ हैं :)

से man bash:

यदि HISTFILESIZEसेट नहीं किया जाता है, तो कोई छंटनी नहीं की जाती है।

इसका मतलब यह है .bash_historyकि कभी नहीं काट दिया

इसके साथ ही वही लागू होता है HISTSIZE, हालाँकि मुझे वह दस्तावेज नहीं मिला।

एक और साफ सुविधा जो मैं आजमाने जा रहा हूँ वह है:

यदि HISTTIMEFORMATवैरिएबल सेट किया गया है, तो समय स्टैम्प्स को इतिहास फ़ाइल में लिखा जाता है, जो इतिहास टिप्पणी चरित्र के साथ चिह्नित है, इसलिए उन्हें शेल सत्रों में संरक्षित किया जा सकता है, जैसे कि निम्नलिखित:

export HISTTIMEFORMAT="%F %T "

मुझे पता है अगर तुम कोशिश की है कि पहले से ही ...


3
यह वास्तव में कई मामलों के लिए काम नहीं करता है और बैश इतिहास अभी भी काट दिया जाता है। अधिक संपूर्ण समाधान के लिए नीचे मेरा उत्तर देखें।
फोतिनाकिस

2
चेतावनी: यह सिरदर्द का कारण बनता है gdb; यदि आप एक HISTSIZEचर सेट करते हैं, तो इसे 0 के रूप में ले जाएगा, इस प्रकार पूरी तरह से इतिहास आकार को अक्षम कर देगा।
मत्तेओ इटालिया

2
नोट: आपको ज़रूरत नहीं है export, HISTFILESIZEलाइनों की संख्या में है (बाइट्स नहीं), और इतिहास फ़ाइल ट्रंकटिंग तब होती है जब आप चर सेट करते हैं HISTFILESIZE (और जब शेल बाहर निकलता है)। इसलिए इसे अलग-अलग मानों के साथ अपनी कॉन्फ़िग फ़ाइल में दो बार सेट न करें ...
vaab

@ हाब: अगर मैं हिस्टीमर का निर्यात नहीं करता हूं, तो मैं यह नहीं देख सकता कि मेरे हिस्टफाइल "सब कुछ में इको $ हिस्टीयर" का उपयोग क्या कर रहा है, इसलिए जब यह आवश्यक नहीं है, तो यह मददगार हो सकता है और इससे कोई नुकसान नहीं है जिसका मैं पता लगा सकता हूं।
जेफ लीमैन

41

( https://stackoverflow.com/a/19533853/128597 से मेरे उत्तर को रद्द करना )

वर्षों में कई बड़े, बदसूरत पुनरावृत्तियों और अजीब बढ़त के मामलों के बाद, अब मेरे पास अपने .bashrc का एक संक्षिप्त खंड है जो इसे समर्पित है।

सबसे पहले, आपको अपने .bashrc (Ubuntu के लिए डिफ़ॉल्ट) के इस अनुभाग को टिप्पणी या हटाना होगा । यदि आप नहीं करते हैं, तो कुछ वातावरण (जैसे screenसत्र चलाना ) अभी भी आपके इतिहास को तोड़ देगा:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

दूसरा, इसे अपने .bashrc के नीचे जोड़ें :

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

नोट: प्रत्येक कमांड को चलाने के तुरंत बाद लिखा जाता है, इसलिए यदि आप गलती से एक पासवर्ड पेस्ट करते हैं, तो आप इतिहास लिखने से बचने के लिए सिर्फ "किल -9 %%" नहीं कर सकते, आपको इसे मैन्युअल रूप से निकालना होगा।

यह भी ध्यान दें कि प्रत्येक बैश सत्र पूरे इतिहास फ़ाइल को मेमोरी में लोड करेगा, लेकिन भले ही आपकी इतिहास फ़ाइल 10MB तक बढ़ जाए (जिसमें लंबा, लंबा समय लगेगा) आप अपने बैश स्टार्टअप समय पर बहुत अधिक प्रभाव नहीं देखेंगे।


4
जब आप सेट करते हैं HISTFILESIZE, तो इतिहास फ़ाइल को छोटा कर दिया जाता है , यही कारण है कि आपको इस तरह की किसी भी घटना को दूर करना चाहिए, जिसको आप चाहते हैं। इसे शेल एग्जिट पर भी काट दिया जाएगा (लेकिन यह अपेक्षित है)। और आप की जरूरत नहीं होनी चाहिए export
वाब

3
@ अगर आप निर्यात नहीं करते हैं, तो ऐसा कुछ bash --norcकरना इतिहास को फिर से काट देगा।
योंगवेई वू

1
मैं export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"शेल इतिहास को प्रति सत्र (hostname और tty नाम के आधार पर) अलग रखने के लिए उपयोग करता हूं । बेशक मुझे पहले ~ / हिस्ट डायरेक्टरी बनानी होगी।
जेफ लीमैन

2
ध्यान दें कि आप PROMPT_COMMAND के मूल्य की जांच करना चाहते हैं और इसे बार-बार आँख बंद करके नहीं देखना चाहेंगे क्योंकि यह आपके सिस्टम को पागल कर देगा। एक नल जाँच या बेहतर अभी तक एक शेल चर विस्तार खोज शायद सुरक्षित है।
ड्रैगन 788

3
मैं इस मुद्दे से बचने के लिए @ ड्रैगन 788 का उल्लेख करता हूं:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
ब्रायन

9

~ / .Bashrc में शामिल करें :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

यह उत्तर निम्न मानदंडों को पूरा करता है:

  1. एक अलग मास्टर इतिहास (कोई सत्र आपके इतिहास को बाधित नहीं कर सकता)

  2. स्वचालित इतिहास लेखन (कोई हॉटकी नहीं)

  3. अनंतिम लिखते हैं (प्रत्येक आदेश के बाद कोई जोड़ नहीं)

पृष्ठभूमि

इंटरएक्टिव स्टार्टअप पर, यदि $HISTFILESIZEकिसी नंबर पर सेट किया गया है , तो $HISTFILEउस नंबर पर ट्रैश करें। इंटरेक्टिव क्लोज़ पर, यदि शेल विकल्प histappendसेट है, तो बैश $HISTSIZEलाइन को जोड़ देता है $HISTFILE, अन्यथा यह ओवरराइट हो जाता है $HISTFILE

OSX (टर्मिनल) के लिए टिप्स

हर बार टर्मिनल में एक टैब बनाया ~/.bash_profileजाता है, पढ़ा जाता है, जिसका अर्थ है कि बैश आपके पढ़ने के लिए नहीं जाता है ~/.bashrc। निम्न पंक्ति को अपने में जोड़ें ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

स्क्रीन के लिए टिप्स

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

# use bash, make it a login shell
defshell -bash

3

एक अलग अवधारणा (लागू नहीं हो सकती है) लेकिन शेल-सिंकunlimited का उपयोग करते समय आपके पास इतिहास हो सकता है ।

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