कई कॉन्सोल से बैश इतिहास को सहेजना सही ढंग से काम नहीं कर रहा है


9

मैं कई कंसोल कंसोल का उपयोग करता हूं। और मैं चाहता हूं कि कमांड में दर्ज किए जाने वाले हर टर्मिनल में मेरे द्वारा लिखी गई सभी कमांड्स हों, ताकि अगले कोनोलेज़ जो मेरे पास हैं, उनमें से सभी खुले हों। प्रत्येक टर्मिनल को दूसरे टर्मिनल के कमांड इतिहास को लिखने से रोकने के लिए, मैंने अपने में निम्नलिखित सेटिंग्स दीं.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

मैंने अपने प्रॉम्प्ट में कमांड नंबर देखने के लिए अंतिम पंक्ति दी। कमांड नं। 600 से ऊपर कभी नहीं गया, लेकिन अभी भी मेरे कुछ पुराने आदेश इतिहास से गायब हो रहे हैं। कई कमांड हैं जो बार-बार दिए जाते हैं, लेकिन जैसा कि उम्मीद की जाती है ignoredups, यह कमांड प्रॉम्प्ट में कभी नहीं बढ़ता है। फिर भी पुराने आदेश अभी भी गायब हैं। और इतिहास में आदेशों की संख्या हमेशा 500 से थोड़ा अधिक शेष है।

.bash_historyफ़ाइल अभी भी ignoredups के बावजूद डुप्लिकेट की एक बहुत कुछ शामिल।

पुनश्च: इको का आउटपुट $HISTSIZEऔर $HISTFILESIZEदोनों हैं=1000


अद्यतन: मुझे उपरोक्त प्रविष्टि में समस्या मिली .bashrc। बस कॉलिंग history -aमें PROMPT_COMMANDपिछले नए कमांड को .bash_history से जोड़ा जाता है। तो ignoredupsऔर erasedupsकोई प्रभाव नहीं है।

क्या कोई रास्ता है, मैं अभी भी .bash_history को हर टर्मिनल से डुप्लिकेट के बिना लिख ​​सकता हूं? मैं प्रत्येक कमांड प्रॉम्प्ट पर पूरे इतिहास को लोड करके history -rइसे फिर से लिखना नहीं चाहता history -w, क्योंकि मैंने जो आदेश एक टर्मिनल में जारी किए हैं, वे दूसरे समानांतर चलने वाले टर्मिनल में भी दिखाई देंगे। मैं चाहता हूं कि संयुक्त आदेश केवल एक नए टर्मिनल में दिखाई दें।

पहेली, क्यों मेरा इतिहास 500 के करीब हो रहा था, हल हो गया है। मैंने देखा कि यह हर बार जब मैं इस मशीन में ssh हुआ। .bash_profileनिम्नलिखित प्रविष्टि के साथ बनाना इस समस्या को हल करता है।

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

अब मेरा .bashrc हर बार जब मैं भी ssh निष्पादित किया जाता है। और इतिहास फ़ाइल का आकार अब नीरस रूप से बढ़ रहा है।


क्या यह तुम्हारे बाद है? unix.stackexchange.com/questions/1288/…
jasonwryan

नहीं, मैं ओली की सूची में दूसरी आवश्यकता से बचना चाहता हूं। मैं अपने अलग टर्मिनल के इतिहास को मिश्रित नहीं करना चाहता। जब तक मैं एक नया टर्मिनल शुरू नहीं करता। यह स्वाभाविक रूप से होता है जब मैं अपनी मशीन को ठीक से बंद करता हूं। लेकिन कभी-कभी उचित शटडाउन संभव नहीं होता है और जब तक मैं इतिहास को तत्काल नहीं सहेजता, सभी अचानक बिजली बंद हो जाएंगे।
भारतजो

bug-bashइस प्रश्न के पोस्ट होने के एक साल बाद मेलिंग लिस्ट में आने वाले सवाल के लिए बहुत अधिक एक जैसा लगता है : lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
वाक्यविन्यास

जवाबों:


1

मैंने निष्कर्ष निकाला है कि किसी भी डुप्लिकेट को निकालने के लिए सीधे और उसी समय नए कमांड को जोड़ना संभव नहीं है। तो मेरा समाधान है कि कुछ ही देर में निम्नलिखित कमांड को चलाएं। या यह मेरे crontab में डाल करने के लिए।

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

उपरोक्त आदेश एक आदेश की अंतिम घटना को रखेगा और आदेश को गड़बड़ाने के बिना इतिहास फ़ाइल से इसके ऊपर के प्रत्येक अन्य पुनरावृत्ति को हटा देगा।


0

यह बदसूरत है, और मुझे यकीन है कि sedया awkबेहतर होगा, लेकिन मैंने इसे अपने साथ जोड़कर उसी समस्या को ठीक करने की कोशिश की .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

यह आपके द्वारा खोले जाने वाले प्रत्येक टर्मिनल के लिए एक अलग इतिहास फ़ाइल बनाएगा, हालांकि यदि आप बैश के भीतर बैश चलाते हैं, तो यह उसी इतिहास का उपयोग करेगा, लेकिन इसे अधिलेखित नहीं करना चाहिए। मैं आपको अपने अनुभव से एक चेतावनी के साथ चेतावनी दूंगा। हालांकि यह काम करता है और इतिहास को अधिलेखित होने से बचाता है, आपके पास grepउस इतिहास को खोजने और खोजने के लिए कई फाइलें हैं, जो कभी-कभी समय लेने वाली हो सकती हैं।

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