Ncurses एप्लिकेशन से कॉल की गई स्क्रिप्ट के आउटपुट में एस्केप अनुक्रम


14

मैं वर्तमान में अपने होमबाइवर पर tmux सत्र में अपने जाबर क्लाइंट (जो ncurses का उपयोग करता है) के रूप में mcabber चला रहा हूं। स्थानीय रूप से मैं iTerm2 को एक टर्मिनल एमुलेटर के रूप में चलाता हूं, जो कि कैरेक्टर एस्केप सिक्वेंस के माध्यम से ग्रोथ नोटिफिकेशन को ट्रिगर करने का समर्थन करता है।

नोट: echoइस प्रश्न में सभी काम करता है printf %b, या echo -eबैश और GNU में echo

उदाहरण के लिए echo "\e]9;foobar\007"iTerm2 पाठ "फोब्बर" के साथ एक ग्रोएल संदेश भेजता है।

हालांकि, जब एक tmux सत्र में, भागने के क्रम खा जाते हैं। इसलिए मालिकाना चरित्र भागने के अनुक्रम \Ptmuxका उपयोग इस तरह किया जा सकता है:

echo "\ePtmux;\e\e]9;foobar\007\e\\"

यह tmux सत्र के भीतर से एक बढ़ते संदेश को ट्रिगर करता है।

हालाँकि, जब मैं अपने mcabber ईवेंट स्क्रिप्ट में इसका उपयोग करता हूं जो एक नया संदेश प्राप्त होने पर निकाल दिया जाता है, तो कोई सूचना ट्रिगर नहीं होती है, जैसे कि इको गलत टर्मिनल पर भेजा जाता है।

मुझे लगता है कि यह उस mcabber के साथ करना है जो स्क्रिप्ट को ट्रिगर करता है एक ncurses एप्लिकेशन है इसलिए मेरी सामान्य बैश स्क्रिप्ट से आउटपुट खो जाता है और iTerm 2 इसे कभी नहीं देखता है।

मैंने जो कुछ विचार खोजे, उनके प्रतिध्वनित होने से पहले मैंने सफलता के बिना स्मिच को कॉल करने का प्रयास किया

tput smcup
echo "\ePtmux;\e\e]9;$FROM: $MSG\007\e\\"
tput rmcup

मुझे लगता है कि यह काम नहीं करता है क्योंकि यह मुद्दा "वास्तविक टर्मिनल विंडो" पर वापस स्विच नहीं कर रहा है, लेकिन ncurses विंडो पर आउटपुट को अधिक निर्देशित कर रहा है।

इस पर कोई राय?

जवाबों:


1

"स्क्रिप्टर" संदेश भेजने में विफल होने के कारण एक इवेंट-स्क्रिप्ट संदेश mcabberइनपुट इनपुट, आउटपुट और त्रुटि धाराओं को बंद कर देता है, जब यह एक ईवेंट कमांड चलाता है। आप इसमें देख सकते हैं hooks.c:

  if ((pid=fork()) == -1) {
    scr_LogPrint(LPRINT_LOGNORM, "Fork error, cannot launch external command.");
    g_free(datafname);
    return;   
  }    
  if (pid == 0) { // child
    // Close standard file descriptors
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    if (execl(extcmd, extcmd, arg_type, arg_info, bjid, arg_data,
              (char *)NULL) == -1) {
      // scr_LogPrint(LPRINT_LOGNORM, "Cannot execute external command.");
      exit(1);
    }
  }
  g_free(datafname);

इसके द्वारा प्रयुक्त धाराओं के साथ हस्तक्षेप किए बिना घटना की पटकथा चलती है mcabber

वहाँ संदेश (सभी के बाद, में अवरोध डालने के लिए किसी विशेष ncurses विधा है tmuxहै पहले से ही एक terminfo आवेदन के रूप में चल रहा है)। आप संभवत: अपनी समस्या echo( जैसे printf) को पुनर्निर्देशित करके समस्या के आसपास काम कर सकते हैं /dev/tty, जैसे,

#!/bin/sh
printf '\033Ptmux;\033\033]9;foobar\007\033\\' >/dev/tty

0

Tmux और स्क्रीन प्रोग्राम सीधे बच दृश्यों से नहीं गुजरते हैं। वे एप्लिकेशन (स्क्रीन टर्मिनल प्रकार) के लिए एक प्रकार का टर्मिनल प्रस्तुत करते हैं, और खुद दूसरे टर्मिनल के लिए एक ncurses ऐप है। वास्तव में यह टर्मिनल ट्रांसलेटर की तरह है। तो हाँ यह "स्क्रीन" टर्मिनल प्रकार के लिए (या डिस्चार्ज) दृश्यों का उपभोग करता है, और एक बफर डालता है जिसे आप देखते हैं। फिर यह उन बफर परिवर्तन की घटनाओं को लेता है और वर्तमान बफर को प्रदर्शित करने के लिए आप जिस भी प्रकार के टर्मिनल का उपयोग कर रहे हैं। इसलिए मूल ऐप और व्यूइंग टर्मिनल को डिकॉय किया गया है।


0

अगर आप कुछ ऐसा करना चाहते थे ...

export "PTTY=$(tty)"

... अपनी /etc/profileतो हर नए के लिए -login खोल आप आह्वान हैं (जो क्या आम तौर पर जब आप एक नया टर्मिनल विंडो खोलने होता है) कि वातावरण चर अपने बच्चे प्रक्रियाओं के सभी के लिए उपलब्ध कराया जाएगा - जो शामिल होना चाहिए tmuxऔर इसके सभी ।

यह आपको करने में सक्षम होना चाहिए ...

printf '\033]9;foobar\007' >"$PTTY"

... और इस तरह किसी भी ptyपरतों के माध्यम से सही छोड़ें जो आपके वर्तमान शेल और आपके द्वारा उपयोग किए जा रहे टर्मिनल एमुलेटर के बीच मौजूद हो सकते हैं।


0

यदि समस्या यह है कि आपकी बैश स्क्रिप्ट से आउटपुट खो रहा है, तो आप पुनर्निर्देशन के साथ लड़ाई जीत सकते हैं:

इको "\ ePtmux; \ e \ e] 9; फोब्बर \ 007 \ ई \"> / / /ty

हालांकि, मुझे संदेह है कि असली समस्या यह है कि आपको उपयोग करना चाहिए echo -eताकि बैश आपके स्ट्रिंग में भागने के क्रम को संसाधित करता है।

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