कई टर्मिनलों के साथ बैश इतिहास से निपटने


110

मैं मुख्य रूप से टर्मिनेटर का उपयोग करता हूं, और यह आमतौर पर 3 विभाजन टर्मिनल खिड़कियों के साथ खोला जाता है। मैं विभिन्न कारणों से सूक्ति टर्मिनल का भी उपयोग करता हूं।
मैं सोच रहा हूँ कि इस मामले में बैश इतिहास कैसे संभाला जाता है क्योंकि मैं कभी-कभी पहले जारी किए गए आदेशों को याद करता हूं जब मैं दौड़ता हूंhistory

उदाहरण के लिए, मेरा प्रॉम्प्ट वर्तमान बैश हिस्ट्री लाइन ( \!) दिखाता है और अगर मैं टर्मिनेटर को 3 स्प्लिट टर्मिनल विंडो के साथ लॉन्च करता हूं तो मुझे सभी टर्मिनलों पर समान हिस्ट्री लाइन (मान लीजिए 100) कहते हैं। कौन सा इतिहास बच जाएगा?

टर्मिनेटर का उपयोग करने के बाद गनोम टर्मिनल को लॉन्च करना, मुझे टर्मिनेटर में जारी किए गए सभी आदेशों की परवाह किए बिना स्टार्टअप पर लाइन 100 मिलती है


जवाबों:


107

बचाए गए बैश सत्र टर्मिनल के लिए एक है जो नवीनतम बंद है। यदि आप हर सत्र के लिए कमांड को सहेजना चाहते हैं, तो आप यहाँ बताई गई ट्रिक का उपयोग कर सकते हैं

export PROMPT_COMMAND='history -a'

मैनपेज को उद्धृत करने के लिए: "यदि सेट किया जाता है, तो मान को प्रत्येक प्राथमिक संकेत जारी करने से पहले एक कमांड के रूप में निष्पादित किया जाता है।"

इसलिए हर बार जब मेरा कमांड समाप्त हो जाता है, तो यह ~/.bash_historyशीघ्र ही प्रदर्शित करने से पहले अलिखित इतिहास आइटम को फिर से प्रदर्शित करता है (केवल $ PS1)।

इसलिए उस लाइन को अंदर डालने के बाद /etc/bash.bashrcमुझे अपने आप को पहियों को फिर से लगाना नहीं पड़ेगा या मूल्यवान सेकंड को फिर से टाइप करना होगा क्योंकि मैं अपने टर्मिनलों के साथ आलसी था।

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

यह सभी देखें:


यह अलग टीटीएल के लिए अलग से संग्रहीत नहीं है ??
विनीत मेनन

अति उत्कृष्ट। स्पष्टीकरण और समाधान के लिए धन्यवाद। मैंने कोशिश की export PROMPT_COMMAND='history -a; history -r'और मुझे टर्मिनल में कुछ अजीब इतिहास लाइन नंबर मिले - 2000 के बजाय 1 से कुछ कमांड हिस्ट्री लाइन नंबर जंप जारी करने के बाद, जो अजीब है, लेकिन यह कहा गया है - सभी टर्मिनलों के इतिहास को बचाया जाता है।
ज़िताह

@VineetMenon अधिक जानकारी के लिए यहां देखें । दिलचस्प भाग: जब शेल शुरू होता है, तो इतिहास को हिस्टीमर चर (डिफ़ॉल्ट `~ / .bash_history ') नाम की फ़ाइल से आरंभ किया जाता है। [...] जब एक इंटरैक्टिव शेल बाहर निकलता है, तो अंतिम $ HISTSIZE लाइनों को इतिहास सूची से $ HISTFILE नाम की फ़ाइल में कॉपी किया जाता है।
जेकोलाडो

: यह वेबसाइट नीचे लगता है northernmost.org/blog/flush-bash_history-after-each-command
शुभम


32

के कई रीडिंग के बाद man bash, मैं प्रत्येक शेल के लिए अलग इतिहास फ़ाइलों का उपयोग करता हूं। मैंने mkdir -m 0700 ~/.historyतब एक जोड़ा

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

मेरे लिए ~/.bashrc। हर अब और फिर, मुझे याद है du -sk .historyऔर इसे साफ करना है। यह मेरे लिए संरक्षित प्रत्येक कमांड है अच्छा है।

मैं सिर्फ ऊपर का उपयोग करता हूं कि मैं क्या कर रहा हूं, देर से:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
या
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(1 तर्क sudo mountको सॉर्ट श्रृंखला में शामिल करने के लिए)।


3
आप HISTFILESIZEदो बार क्यों असाइन करते हैं ?
डैनियल

2
HISTFILESIZE को 0 पर सेट करके, मैं इतिहास बफ़र को साफ़ करता हूं और इतिहास बचत तंत्र को रीसेट करता हूं। फिर, मैंने वह आकार निर्धारित किया जो मैं वास्तव में चाहता हूं, और इतिहास को इतिहास में सहेजना शुरू करता हूं। का संकेत अनुभाग देखें man bash
वाल्टिनेटर

1
वहाँ Ctrl+rफिर से काम करने के लिए इतिहास फ़ाइलों को मर्ज करने का एक तरीका है ?
n611x007

3
यह एक नया प्रश्न होना चाहिए, लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है। मैं इसके बजाय egrep 'whatever' .history/*(या cat .history/* | egrep 'whatever') का उपयोग करता हूं , और व्यक्तिगत सत्र के इतिहास को खोजने के लिए Ctrl-r का उपयोग करता हूं । man bash-builtinsइतिहास कमांड के बारे में पढ़ें । मेरे sort .history/* | uniq -c | sort -n | wc -lशो में 16033 यूनिक कमांड्स, cut '-d ' -f1 .history/* | sort | uniq -c | sort -n2004 यूनिक कमांड्स, ज्यादातर टाइपोस शो हैं। बैश की "इतिहास सूची" में सभी को लोड करने से मदद नहीं मिलेगी।
वाल्टिनेटर

@waltinator - मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन क्या आप यह आरोप लगा रहे हैं कि पर्यावरण चर स्थापित करने से किसी भी तरह तत्काल कार्रवाई शुरू हो जाती है? इस प्रक्रिया को आप एक स्थानीय शेल में HISTFILESIZE को 0 का मान निर्दिष्ट करने जा रहे हैं और फिर तुरंत 4096 में बदल देंगे? क्या यह कुछ वैरिएबल नामों के हैंडलिंग के बारे में अनिर्दिष्ट है?
unsynchronized

8

historyसभी टर्मिनलों से दिखाने के लिए :

export PROMPT_COMMAND='history -a; history -r'अपनी .bashrc फ़ाइल में जोड़ें ।

स्रोत: http://norunningmost.org/blog/flush-bash_history-after-each-command



3
मैं कहूंगा कि इसे इस्तेमाल करने के कुछ महीनों के बाद मैंने अंततः हाल ही में इस पर टिप्पणी की। यह बिटवॉच है जैसा कि मैं हमेशा पिछले 100 कमांडों के माध्यम से झारना नहीं चाहता हूं, बस एक को चलाने के लिए जिसे मैं मूल रूप से टक्सू फलक में चलाता था मुझे कभी-कभी एक समर्पित लॉग कमांड मिल सकती है जिसमें मुझे पुनरारंभ करने की आवश्यकता होती है।
एलिजा लिन

एक अच्छा समाधान है कि मछली के खोल प्रदान करता है एक history --merge। मैं एक या एक साल से इसका उपयोग कर रहा हूं और यह इस मुद्दे को हल करता है। जब मैं अन्य सत्रों से सबसे हाल का इतिहास चाहता हूं, तो मैं बस उस कमांड को चलाता हूं और यह मेरे लिए तुरंत उपलब्ध है।
एलिय्याह लिन

निर्यात की जरूरत नहीं है।
सीमित प्रायश्चित

6

एक अन्य विकल्प के लिए " लगातार इतिहास को दबाए रखना " भी देखें । यह आपके प्रॉम्प्ट को किसी भी टर्मिनल में टाइप किए गए सभी कमांड को "लगातार इतिहास" फ़ाइल में भेज देता है (साथ में आमतौर पर नियमित रूप से जो किया जाता है .history)।


1
मैंने लाइन बनाने के लिए $ $ डाला। echo $$ $date_part "$command_part" >> ~/.persistent_historyयह उनकी बैश प्रक्रिया के पीआईडी ​​के साथ प्रविष्टियों को उपसर्ग करता है, ताकि हम कई इतिहासों को अलग कर सकें।
इवगेनी सर्गेव

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