रचनात्मक और शामिल संकेत, आप कहते हैं? ठीक:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
चक ु ा कक .bashrcऔर अंदर जाओ। यह bashनए इतिहास प्रविष्टियों की जांच करने के लिए हर प्रक्रिया को बताने के लिए संकेतों का उपयोग करता है जब एक और बाहर निकलता है। यह बहुत भयानक है, लेकिन यह वास्तव में काम करता है।
यह कैसे काम करता है?
trapसिस्टम सिग्नल या बैश की आंतरिक घटनाओं में से एक के लिए एक सिग्नल हैंडलर सेट करता है । EXITघटना है, जबकि खोल के किसी भी नियंत्रित समाप्ति है USR1है SIGUSR1, एक अर्थहीन संकेत हम appropriating रहे हैं।
जब भी शेल बाहर निकलता है, हम:
- सभी इतिहास को स्पष्ट रूप से फ़ाइल में जोड़ें।
SIGUSR1हैंडलर को अक्षम करें और इस शेल को सिग्नल की अनदेखी करें।
bashएक ही उपयोगकर्ता से सभी चल रही प्रक्रियाओं के लिए संकेत भेजें ।
जब SIGUSR1आता है, हम:
- इतिहास फ़ाइल से शेल की इन-मेमोरी इतिहास सूची में सभी नई प्रविष्टियाँ लोड करें।
जिस तरह से बैश हैंडल संकेतों के, आप वास्तव में नया इतिहास डेटा जब तक आप हिट नहीं मिलेगा Enterअगली बार, तो यह डाल के अलावा कोई उस मोर्चे पर बेहतर नहीं करता है history -nमें PROMPT_COMMAND। यह फ़ाइल को लगातार पढ़ने से बचाता है जब कुछ भी नहीं हुआ है, और शेल के बाहर निकलने तक इसमें कोई लेखन नहीं है।
हालाँकि अभी भी यहाँ कुछ मुद्दे हैं। पहला यह है कि शेल को समाप्त करने के लिए डिफ़ॉल्ट प्रतिक्रिया SIGUSR1है । किसी भी अन्य bashप्रक्रिया (उदाहरण के लिए, शेल स्क्रिप्ट चल रही है) को मार दिया जाएगा। .bashrcगैर-संवादात्मक गोले द्वारा लोड नहीं किया गया है। इसके बजाय, नाम से एक फ़ाइल BASH_ENVलोड की गई है : आप अपने वातावरण में उस चर को दुनिया भर में फ़ाइल के साथ इंगित करने के लिए सेट कर सकते हैं:
trap '' USR1
यह उन में संकेत (जो समस्या को हल करता है) को अनदेखा करने के लिए।
अंत में, हालांकि यह वही करता है जो आपने मांगा था, आपको मिलने वाला ऑर्डर थोड़ा असामान्य होगा। विशेष रूप से, इतिहास के बिट्स को अलग-अलग क्रम में दोहराया जाएगा क्योंकि वे अलग-अलग लोड किए जाते हैं और अलग-अलग सहेजे जाते हैं। यह अनिवार्य रूप से आप क्या पूछ रहे हैं में निहित है, लेकिन ध्यान रखें कि अप-एरो इतिहास इस बिंदु पर बहुत कम उपयोगी हो जाता है। इतिहास प्रतिस्थापन और इस तरह साझा किया जाएगा और अच्छी तरह से काम करते हैं, हालांकि।