रचनात्मक और शामिल संकेत, आप कहते हैं? ठीक:
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
यह उन में संकेत (जो समस्या को हल करता है) को अनदेखा करने के लिए।
अंत में, हालांकि यह वही करता है जो आपने मांगा था, आपको मिलने वाला ऑर्डर थोड़ा असामान्य होगा। विशेष रूप से, इतिहास के बिट्स को अलग-अलग क्रम में दोहराया जाएगा क्योंकि वे अलग-अलग लोड किए जाते हैं और अलग-अलग सहेजे जाते हैं। यह अनिवार्य रूप से आप क्या पूछ रहे हैं में निहित है, लेकिन ध्यान रखें कि अप-एरो इतिहास इस बिंदु पर बहुत कम उपयोगी हो जाता है। इतिहास प्रतिस्थापन और इस तरह साझा किया जाएगा और अच्छी तरह से काम करते हैं, हालांकि।