क्या .bash_history को तत्काल लिखना संभव है?


124

मैं अक्सर खुला बहुत सारे और टर्मिनल के बहुत सारे [अभी मेरे पास 7 इस कार्यस्थान पर खुला] और मैं अक्सर खोज historyके साथ grepएक कमांड मैं अभी हाल ही में लिखा है लगता है, लेकिन मैं टर्मिनल नीचे शिकार करने के लिए नहीं करना चाहते हैं और फिर ऊपर स्क्रॉल और इसके लिए शिकार करना, आदि। कभी-कभी मेरे टर्मिनल 'निकास' के बिना बंद हो जाते हैं, और जो कुछ मैंने लिखा है वह खो गया है [कभी-कभी मुझे कुछ चाहिए होता है जिसे मैं एक टर्मिनल में लिखा था जिसे मार दिया गया था]।

तो क्या इसे बनाने का एक तरीका है ताकि प्रत्येक टर्मिनल .bash_history को तुरंत लिख दे? या कम से कम एक बार एक मिनट, या ऐसा कुछ?


2
आम तौर पर मैं control-rएक बैश के कमांड इतिहास में रिवर्स-सर्च का उपयोग करता हूं । history | grepजब तक आप एक regex की जरूरत से अधिक सुविधाजनक ।
पीटर कॉर्ड्स

जवाबों:


92

रीयलटाइम में अपडेट बैश इतिहास में विस्तृत रूप में एक सरल समाधान ।

यह उन आदेशों को .bashrc config में डालने के लिए कहता है:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

पहला कमांड .historyफ़ाइल मोड को एपेंड करने के लिए बदलता है । और दूसरा history -aकमांड को प्रत्येक शेल प्रॉम्प्ट पर चलाने के लिए कॉन्फ़िगर करता है । -aतुरंत इतिहास फाइल करने के लिए वर्तमान / नई लाइनें लिखते हैं।

Zsh के लिए संबंधित:


1
अच्छी तरह से इस तरह के काम करता है। मैंने कुछ और परीक्षण करने की कोशिश की और यह केवल पहले कमांड पर काम करने लगता है। क्या यह आपके लिए सही ढंग से काम करता है?
मैट

54

इसे अपने में डालने का प्रयास करें .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

क्रेडिट यहां: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cचल रहे सत्र के इतिहास को साफ करता है। इससे इतिहास काउंटर कम हो जाएगा $HISTSIZEhistory -rकी सामग्री को पढ़ें $HISTFILEऔर उन्हें वर्तमान चालू सत्र इतिहास में डालें। यह लाइनों की मात्रा द्वारा इतिहास काउंटर को बढ़ाएगा $HISTFILE

मुझे लगता है कि इसका मतलब है कि कमांड लगभग तुरंत उपलब्ध हैं (आपके पास एक टर्मिनल है, लिखना echo 1, दूसरा टर्मिनल echo 2, पहले echo 3और नीचे तीर को दो बार दबाने पर, आपके पास echo 2उपलब्ध होना चाहिए । आपको दिए गए टर्मिनल में एक कमांड जारी करना होगा, जिसके पास एक्सेस हो। लिखा गया है।


प्रतिभाशाली! धन्यवाद। आश्चर्य है कि उन विकल्पों में दस्तावेज क्यों नहीं हैं man history...
आर्टफुलब्रोबॉट

10
@artfulrobot: यह कमांड एक bashबिल्ट-इन है, इसलिए इसमें वर्णित है man bash। आप भी इस्तेमाल कर सकते हैं help history
पाबॉक

2
मेरे पास अपने zsh को इस तरह से काम करने के लिए कॉन्फ़िगर किया गया है: प्रत्येक शेल अपने स्वयं के इतिहास (और उससे पहले, संयुक्त इतिहास) को ट्रैक करता है, और प्रत्येक कमांड को संयुक्त इतिहास में जोड़ा जाता है। यह हर शेल के लिए हर कमांड के लिए इतिहास को फिर से लोड करने से अलग और बेहतर है, क्योंकि मेरे पास प्रत्येक शेल टर्मिनल के लिए एक अलग "काम का धागा" या "नौकरी" है। मुझे लगता है कि इसके साथ -rऔर -cबस होने के बीच का अंतर है -a
स्टीवन लू

तो क्या आप वास्तव में उपयोग कर रहे हैं? history -c; history -r? मुझे लगता है कि यह आपके लिए बेहतर है, यह केवल मेरे लिए बेहतर होगा कभी-कभी, मैं एक काम करने के लिए अक्सर कई गोले का उपयोग करता हूं इसलिए मैं इतिहास को जितना संभव हो उतना संयुक्त करना पसंद करता हूं। मैं वास्तव में यह सोचता हूं कि कमांड को पूरा होने के बाद ही इतिहास में लिखा जाए। आमतौर पर, जब मैं एक होस्ट के लिए एक ssh सत्र शुरू करता हूं और एक और एक खोलना चाहता हूं, जबकि पहला अभी भी चल रहा है, तो मुझे इसे फिर से लिखना होगा क्योंकि यह अभी तक इतिहास के लिए नहीं लिखा गया है।
सुपर

मुझे लगता है कि मैं कभी भी लंबे समय तक यह जानने में नहीं फंसा रहा कि कैसे मुख्य इतिहास फ़ाइल में इतिहास लिखते समय इतिहास के समानांतर धागे (प्रति शेल उदाहरण के आधार) को एक साथ ट्रैक किया जाए। Zsh को ऐसा करना बहुत आसान लगता है, साथ ही मैंने अपने डेविसिंग के एन्हांसमेंट -हिस्ट्री फ़ाइल में बहुत सारे फैंसी मेटाडेटा लिखने के लिए एक zsh फंक्शन को परिभाषित किया है । यह बल्कि अपरिहार्य हो गया है। वैसे भी, zsh के लिए प्रेडमड () और प्रीक्सेक () दर्ज कमांडों का वर्णन करने वाले भेजे गए आर्ग्स हैं। यह तो फ़ाइलों को निर्देशित करने के लिए तुच्छ हो जाता है। history -aपर्याप्त हो सकता है
स्टीवन लू

38

मैं 100000 के बारे में प्रविष्टियों के साथ एक बड़ा इतिहास फ़ाइल है, और वेरिएंट कि इतिहास सूची को साफ़ और पूरे इतिहास फ़ाइल को पढ़ने (का उपयोग करते हुए history -cऔर history -r) से पहले संकेत दिखाई देने पर एक ध्यान देने योग्य (शायद 0.2 सेकंड) देरी परिचय। का प्रयोग history -nइतना है कि केवल नई लाइनों इतिहास फ़ाइल से पढ़ा जाता है तेजी से होता है:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND निर्यात नहीं करना पड़ता है क्योंकि यह एक शेल वैरिएबल है।


प्रतिभाशाली! जब कनेक्शन गिरा दिया जाता है तो कोई और खोया इतिहास नहीं!
तोबिया

यह अद्भुत है। फ़ाइल में संलग्न होने और फ़ाइल से पढ़ने से, यह कई टर्मिनलों में इतिहास साझा करेगा।
वारबीस

3

अन्य सभी उत्तरों के लिए एक नोट (जो मूल रूप से एक ही बात है):

(या दोस्तों) PROMPT_COMMAND="history -a;$PROMPT_COMMAND"में सेट करना .bashrcकाफी है।

history -aजब भी आप वर्तमान सत्र में इतिहास को "स्नैपशॉट" करना चाहते हैं , तो आप मैन्युअल रूप से चला सकते हैं ।

आदेश shopt -s histappendकी आवश्यकता नहीं है क्योंकि history -aहमेशा फ़ाइल में नई लाइनें संलग्न होती हैं और इसे कभी भी अधिलेखित नहीं किया जाता है। इसके अलावा, कम से कम बैश 4 histappendके रूप में, डिफ़ॉल्ट व्यवहार है।


मेरे मैक 10.13.6 पर ऐसा लगता है कि यह बिना काम नहीं करता था shopt -s histappend। यह भी ध्यान रखें कि मैं अपने में जोड़ा~/.bash_profile
ubershmekel

संभवतः आपके सिस्टम में कहीं और एक सेटिंग है जो अक्षम है histappend, जैसा कि डिफ़ॉल्ट व्यवहार है। मैं इसके लिए देखूंगा, लेकिन मेरे पास मैक तक पहुंच नहीं है।
Guss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.