एक टर्मिनल से बाहर निकलने पर अन्य टर्मिनलों पर बैश इतिहास को अपडेट करें


15

मुझे पता है कि यह सवाल अस्पष्ट नहीं है, क्योंकि यहां पूछा गया है कि अपडेट करते रहें (और यहां नकल की गई)।

मैं जो हासिल करने की कोशिश कर रहा हूं वह थोड़ा अलग है। मुझे अपने प्रॉम्प्ट को हर lsI टाइप ( history -a; history -c; history -r) में फिर से लिखने का विचार पसंद नहीं है ।

मैं बाहर निकलने पर फ़ाइल को अपडेट करना चाहूंगा। यह आसान है (वास्तव में, डिफ़ॉल्ट), लेकिन आपको पुनर्लेखन के बजाय संलग्न करना होगा:

shopt -s histappend

अब, जब एक टर्मिनल बंद हो जाता है, तो मैं सभी अन्य लोगों को बनाना चाहूंगा जो अपडेट के बारे में जागरूक रहें।

मैं $PS1हर commandउस प्रकार की जांच के बिना ऐसा करना पसंद करता हूं जो मैं टाइप करता हूं। मुझे लगता है कि किसी तरह के सिग्नल को पकड़ना बेहतर होगा। आप वह कैसे करेंगें? यदि संभव न हो, तो एक सरल cronjob?

हम इस पहेली को कैसे हल कर सकते हैं?


1
ध्यान दें कि zsh बॉक्स से बाहर करता है (और इसमें इतिहास को साझा करने के लिए कई विकल्प हैं)।
गिल्स एसओ- बुराई को रोकें '

धन्यवाद @ गिले; मजेदार, लिनक्स का उपयोग करने वाले वर्ष और मैंने कभी भी कुछ भी करने की कोशिश नहीं की bash। हो सकता है कि इसका समय कुछ नया चेक करने का हो, सिर्फ मनोरंजन के लिए।
डॉ। बीको जूल

जवाबों:


15

रचनात्मक और शामिल संकेत, आप कहते हैं? ठीक:

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

यह उन में संकेत (जो समस्या को हल करता है) को अनदेखा करने के लिए।

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


मुझे आश्चर्य है कि यदि आपने .bashrcफ़ाइल के भीतर मुद्रांकन करने में समय सक्षम किया है, और फिर एक क्रोनजॉब जैसा कुछ आया था और समय-समय पर फ़ाइल का सहारा लेते हैं, SIGUSR1तो आप स्निपेट के अनुसार भेजते हैं , क्या आप कालानुक्रमिक अप-एरो इतिहास प्राप्त कर सकते हैं?
forquare

यह एक साफ समाधान है, लेकिन इस तथ्य के लिए अन्य प्रक्रियाएं USR1 पर समाप्त हो जाती हैं। क्या यह व्यवहार USR2 के साथ भी होता है?
डॉ। बनो

मैं दूसरी टिप्पणी जोड़ूंगा, क्योंकि मैं चकित हूं। USR1 के साथ एसोसिएट TERM कैसे आती है? USR1 केवल उपयोगकर्ता द्वारा उपयोग किए जाने के लिए कुछ नहीं है ?? यह कुछ है linux bug?? अन्य प्रक्रिया USR1 को क्यों पकड़ रही है? (मुझे पता है कि इसका मतलब यहां चर्चा नहीं है, लेकिन शायद मैं इसे सही जगह पर लाऊंगा)
डॉ। बनो

लगभग सभी संकेतों का डिफ़ॉल्ट व्यवहार समाप्त करना है; यह POSIX में निर्दिष्ट है । यह बग नहीं है। बैश आपको यह निर्दिष्ट करने देगा कि इसकी सभी प्रक्रियाओं के लिए संकेत को नजरअंदाज कर दिया जाएगा, हालांकि, यह हमारे उद्देश्यों के लिए ठीक है।
माइकल होमर

धन्यवाद @MichaelHomer। क्या यह विनिर्देश आपके द्वारा BASH_ENVइस उत्तर में बताए अनुसार किया गया है? या क्या आप इस बुराई को बंद करने के लिए अधिक मानक तरीका जानते हैं?
डॉ। बीईओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.