नए ग्राफ़िकल लॉगिन को प्रतिबिंबित करने के लिए स्क्रीन सत्र पर्यावरण चर को अपडेट करना?


20

मैं linux का उपयोग करता हूं, और मैं अपने सभी कमांड-लाइन को एक स्क्रीन स्क्रीन सत्र के भीतर करना पसंद करता हूं, ताकि मैं अपने टर्मिनलों को खोए बिना अपने ग्राफ़िकल लॉगिन को पुनः आरंभ कर सकूं। हालाँकि, जब मैं लॉग आउट करता हूं और अपने ग्राफिकल सत्र में वापस आता हूं, तो यह मेरे सभी सत्र पर्यावरण चर जैसे डीबस सत्रों को बदल देता है। इसका मतलब यह है कि फिर से लॉग इन करने के बाद, मेरे स्क्रीन सत्र में अब पुराने (और गलत) पर्यावरण चर हैं। इसलिए अब जब मैं अपने स्क्रीन सत्र से चित्रमय कार्यक्रम शुरू करने की कोशिश करता हूं, तो सबसे अच्छा वे सत्र बस से जुड़ने में सक्षम नहीं होने के बारे में चेतावनी देते हैं। सबसे खराब रूप से, वे पूरी तरह से शुरू करने में विफल रहते हैं।

इसलिए, मैं जो खोज रहा हूं वह स्क्रीन के चल रहे उदाहरण में पर्यावरण चर को संशोधित करने का एक तरीका है, ताकि बाद में बनाई गई सभी स्क्रीन खिड़कियां नए पर्यावरण चर का उत्तराधिकार देंगी। क्या इसे करने का कोई तरीका है?


3
अहा! मैंने इसे खोजने के लिए बस पूरे स्क्रीन मैनपेज के माध्यम से पृष्ठांकित किया:setenv [var [string]] Set the environment variable var to value string. If only var is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells.
रयान सी। थॉम्पसन

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

ध्यान दें कि बायोबू अब स्क्रीन और tmux दोनों के लिए इसके लिए एक समाधान शामिल करता है।
रयान सी। थॉम्पसन

जवाबों:


8

आप screenसत्र से शेल स्क्रिप्ट शुरू नहीं कर सकते क्योंकि यह पुराने वातावरण को विरासत में मिला है। हालाँकि, आप पुराने स्क्रीन सत्र में नए पर्यावरण चर प्राप्त करने के लिए हमारे लिए एक पा सकते हैं। जब आप अपना ग्राफिकल सत्र शुरू करते हैं, तो आप उस तारीख को भर सकते हैं।

#!/bin/bash
FIFO=/tmp/your_variables
[ -e $FIFO ] && cat $FIFO > /dev/null || mkfifo $FIFO

# save number of variables that follow
NVARS=2
echo $NVARS > $FIFO
echo ENV1=sth1 > $FIFO
echo ENV2=sth2 > $FIFO

लॉगिन पर पृष्ठभूमि में उस स्क्रिप्ट को शुरू करें (यह केवल तभी समाप्त होगा जब सभी चर इसे से पढ़े जाते हैं)।

अब आप पांडो से पढ़ सकते हैं, उदाहरण के लिए इस फ़ंक्शन को अपने साथ जोड़ें .bashrc

update_session() {
  FIFO=/tmp/your_variables

  NVAR=$(cat $FIFO)
  for i in $(seq $NVAR); do
    export $(cat $FIFO)
  done
  #delete the pipe, or it will not work next time 
  rm $FIFO
}

ताकि आप अपने पुराने screenसत्र में कर सकें

update_session

विंडो के मुख्य शेल को संशोधित करने के लिए आपको रनिंग सेशन में प्रति विंडो एक बार ऐसा करने की आवश्यकता नहीं होगी?
क्विक कोटे को

अच्छा, हालांकि जैसा कि ~ क्वैक कहते हैं, आपको प्रत्येक शेल को स्वतंत्र रूप से अपडेट करने की आवश्यकता है।
dmckee

ठीक है, आपको प्रत्येक शेल में ऐसा करने की आवश्यकता है screen। AFAIK screenबाहर से सत्र चलाने के साथ संवाद करने के लिए कोई सॉकेट या समान नहीं उजागर करता है।
बेंजामिन बैनिएर

@ मिक्की लेकिन निश्चित रूप से हर नए screen सत्र में पहले से ही हाल ही में पर्यावरण चर
बेंजामिन बैनियर

मैंने अभी इस उत्तर को स्वीकार करने का निर्णय लिया है। अगर मुझे कभी भी वास्तव में इसे लागू करने के लिए मिलता है, तो मैं अपडेट करूंगा। लेकिन अभी के लिए, यह जानने के लिए कि यह सैद्धांतिक रूप से संभव है, यह समझने के लिए गर्म फजी महसूस करने के लिए पर्याप्त है।
रयान सी। थॉम्पसन

2

मैंने ऐसा करने के लिए एक स्क्रिप्ट लागू की है। आप इसे यहाँ प्राप्त कर सकते हैं: https://github.com/DarwinAwardWinner/screen-sendenv

screen-sendenv.pyअपने में डालने के बाद $PATH, आप अपने स्नोबेट में निम्नलिखित स्निपेट का उपयोग कर सकते हैं:

VARS_TO_UPDATE="DISPLAY DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER GPG_AGENT_INFO"
screen_pushenv () {
  screen-sendenv.py -t screen $VARS_TO_UPDATE
}
tmux_pushenv () {
  screen-sendenv.py -t tmux $VARS_TO_UPDATE
}
screen_pullenv () {
  tempfile=$(mktemp -q) && {
    for var in $VARS_TO_UPDATE; do
      screen sh -c "echo export $var=\$$var >> \"$tempfile\""
    done
    . "$tempfile"
    rm -f "$tempfile"
  }
}
tmux_pullenv () {
  for var in $VARS_TO_UPDATE; do
    expr="$(tmux showenv | grep "^$var=")"
    if [ -n "$expr" ]; then
      export "$expr"
    fi
  done
}

इसका उपयोग करने के लिए, बस अपने स्क्रीन सेशन को रीटच करने से screen_pushenvपहले चलाएं screen -r। फिर, के साथ संलग्न करने के बाद screen -r, आप अपने मौजूदा गोले में पर्यावरण को अपडेट कर सकते हैं screen_pullenv। Tmux फ़ंक्शंस tmux के लिए समान कार्य को पूरा करता है, स्क्रीन के समान एक और टर्मिनल मल्टीप्लेक्स।


वाह रेयान, वह बहुत कोड है। पहले स्वीकार किए गए उत्तर में क्या गलत था (यह कम से कम प्रेरणादायक था)?
बेंजामिन बैनियर

1
खैर, मुझे पता चला कि स्क्रीन (और भी tmux) में एक "सेटेनव" कमांड है जो स्क्रीन के लिए एक वातावरण चर सेट करता है, न कि स्क्रीन की वर्तमान विंडो में शेल। तो इसका मतलब है कि आप मेरी स्क्रिप्ट का उपयोग करने के बाद, उस स्क्रीन सत्र में सभी नई बनाई गई विंडो स्वचालित रूप से नया वातावरण प्राप्त करेंगे, बिना उनमें से हर एक में अपडेट स्क्रिप्ट को चलाने के लिए। बेशक, एक अद्यतन स्क्रिप्ट अभी भी मौजूदा गोले को अपडेट करने के लिए उपयोगी हो सकती है, लेकिन आपको इसे फिर से लिखने के लिए नहीं लिखना होगा, बल्कि नए मूल्यों के लिए स्क्रीन / tmux सत्र को क्वेरी करना होगा।
रयान सी। थॉम्पसन

आप देख सकते हैं कि स्क्रीन और tmux सत्र से चर को वर्तमान शेल में कैसे खींचा जा सकता है , screen_updateऔर tmux_updateकार्यों में। मैं इनमें से एक बायोबु-स्वतंत्र संस्करण के साथ अपने उत्तर को अपडेट करूंगा।
रयान सी। थॉम्पसन

1
वैसे भी, आपके प्रश्न का उत्तर देने के लिए जो गलत था, आपका उत्तर प्रश्न का पर्याप्त उत्तर नहीं देता है, बल्कि संबंधित प्रश्न का उत्तर देता है। आप दिखाते हैं कि स्क्रीन सत्र के अंदर चल रहे शेल के अंदर पर्यावरण चर को कैसे अपडेट किया जाए, लेकिन स्क्रीन सत्र में ही पर्यावरण चर को कैसे अपडेट किया जाए (जैसे कि नव-स्पॉन वाली खिड़कियां नए मानों को प्राप्त करती हैं)। मैं इसे समय में स्वीकार किया, क्योंकि यह अभी भी एक अच्छा समाधान था, लेकिन मैं हमेशा के लिए चाहते थे, अंत में मेरे सवाल का कोई वास्तविक जवाब को लागू के रूप में पूछा । इसलिए, कुछ भी व्यक्तिगत नहीं।
रयान सी। थॉम्पसन

हे रयान, जवाब देने के लिए धन्यवाद। अब जब आपने उल्लेख किया है कि setenvमैं देखता हूं कि यह कैसे बेहतर है। यह आपके द्वारा लिंक किए गए कोड से स्पष्ट नहीं था। एक बार फिर धन्यवाद!
बेंजामिन बैनियर

2

आप setenvस्क्रीन प्रक्रिया में पर्यावरण चर को बदलने के लिए कमांड को अंतःक्रियात्मक रूप से उपयोग कर सकते हैं: Ctrl- A+ :setenv( :स्क्रीन कमांड में वर्ण दर्ज करें।) आपको पर्यावरण चर नाम और मूल्य के लिए संकेत दिया जाएगा।

ध्यान दें कि (अन्य उत्तरों / टिप्पणियों के अनुसार) यह (मूल) स्क्रीन प्रक्रिया और इसलिए नए बनाए गए स्क्रीन सत्रों को प्रभावित करता है, लेकिन आपके वर्तमान स्क्रीन सत्र को नहीं और न ही किसी मौजूदा स्क्रीन सत्र को।

आप पर्यावरण चर नाम और मान को उसी समय निर्दिष्ट कर सकते हैं जब आप चाहते हैं: Ctrl- A+ :setenv DISPLAY :100। नए स्क्रीन सत्रों के लिए ": 100" को प्रदर्शित करेगा।

पर्यावरण चर को हटाने के लिए आप 'unsetenv' - जैसे Ctrl- A+ का उपयोग कर सकते हैं:unsetenv DISPLAY


0

यह शायद एक सरल समाधान है (आप तय करते हैं)। savedisplayहर बार screenकमांड चलाने वाले फ़ंक्शन को कॉल करने वाला महत्वपूर्ण हिस्सा है। आदेश स्वचालित रूप से नहीं चलाए जाते हैं, इसलिए ~/.bashrcकुछ विशेष की तरह कुछ के बजाय रखा जा सकता है ~/.ssh/rc

savedisplay() {
    # Write latest bash display to a file, This is used to 
    # update running bash sessions for a "screen -r"
    echo "export DISPLAY=$DISPLAY" > ~/.XDISPLAY
    echo "export XAUTHORITY=$XAUTHORITY" >> ~/.XDISPLAY
    # This will only update the environment for new windows
    screen -X setenv DISPLAY $DISPLAY
    screen -X setenv XAUTHORITY $XAUTHORITY
}

# run this to update env variable in a running session
updatedisplay() {
    source ~/.XDISPLAY 
}

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