बैश स्क्रिप्ट (.bashrc आदि) में X सत्र का पता लगाना


16

हाल ही में मैंने xset b offअपने .bashrc में डाला । जब मैं tty से या ssh के माध्यम से अर्थात X सत्र के बाहर लॉग इन करता हूँ, तो मैं उस त्रुटि से परेशान हो जाता हूँ।

मेरे दिमाग में सबसे पहले जो चीज आई थी [[ -z "$SOME_VAR" ]] && xset b off (अच्छी तरह से, पता चला है कि परीक्षण चर सेट किया जा रहा है। खाली होना एक अलग सवाल है)। लेकिन कौन सा SOME_VAR सही है?

इसलिए मैंने tty के setआउटपुट और urxvt के setआउटपुट को यह देखने के लिए अलग किया कि कौन से चर X में सेट हैं और tty में गायब हैं। जैसा कि अपेक्षित था, काफी अंतर थे (केवल उन लोगों को सूचीबद्ध करना जो मेरे लिए प्रासंगिक थे):

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

यह पता लगाने के लिए कि मैं X सत्र में हूं या नहीं, परीक्षण करने के लिए कौन सा सबसे सही और सार्वभौमिक है? ऐसा कुछ जो संभव के रूप में कई distros और प्लेटफार्मों और डेस्कटॉप वातावरण में काम करेगा?

या वहाँ पर्यावरण चर परीक्षण से भी बेहतर तरीका है?

जवाबों:


8

यह जांचने का एक सरल और प्रभावी तरीका है कि आपका डिस्प्ले सर्वर उपलब्ध है और इसे परीक्षण करना वैध है xhost। आप हमेशा DISPLAYचर में मान के लिए जाँच पर भरोसा नहीं कर सकते क्योंकि इसे अमान्य मान के साथ सेट किया जा सकता है।

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

ऐसा करने का कारण यह है कि मैं अपने उपयोगकर्ता में कई स्क्रिप्ट चलाता हूं crontabजो कि मौजूद होने पर डिस्प्ले पर काम करता है, लेकिन जब नहीं तो अलग तरह से काम करता है। मेरे शीर्ष पर crontab, मैंने DISPLAYचर को सेट किया :0भले ही यह अभी तक मौजूद नहीं है। इसके crontabसाथ @rebootशुरू होने वाले लिपिकों की परवाह किए बिना शुरू होगा कि आपके पास प्रदर्शन है या नहीं। यह आपको गतिशील रूप से पता लगाने की अनुमति देगा जब आपका प्रदर्शन आता है और उसी स्क्रिप्ट के भीतर जाता है।

नोट: >&केवल bash> = 4. में काम करता है अन्यथा उपयोग करें> /dev/null 2>&1


अच्छा, के साथ भी परीक्षण किया गया ssh -X; ठीक काम करता है!
एलोइस महदाल २ '

13

मुझे लगता है कि जाँच DISPLAYकरना सबसे अच्छा तरीका होगा।

  • यह रिमोट लॉगिन (जैसे ssh -X) को संभालता है।
  • यह अधिकांश में उपलब्ध है - यदि सभी प्लेटफॉर्म नहीं हैं।
  • यह विंडो मैनेजर / DE से स्वतंत्र है।

2
मैं भी DISPLAYसामान्य रूप से त्रुटि संदेश के लिए जाऊंगा या दबाऊंगा। /dev/nullसमय-समय पर थोड़ा प्यार दें ।
ठंढकुट्ज़

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

1
मैंने उत्तर के तुरंत बाद इस दृष्टिकोण का उपयोग करना शुरू कर दिया, और sshअब तक पूरी तरह से सरल एस के साथ काम किया , जब मैंने करना शुरू कर दिया ssh -X--- ssh पर विम का उपयोग करने में सक्षम होने के लिए ताकि दृश्य मोड द्वारा चयनित सामग्री स्थानीय एक्स क्लिपबोर्ड को मिल जाए, जिसके लिए आपको सर्वर साइड पर xserver की आवश्यकता नहीं है । तो DISPLAY बस सेट करने के प्रभाव के रूप में बस अग्रेषण को सक्षम करता है, भले ही xserver और xset मौजूद न हो।
एलोइस महदाल


1
आपका DISPLAYचर एक डिस्प्ले को इंगित कर सकता है जिसमें वास्तव में एक एक्स सर्वर नहीं चल रहा है (उदाहरण के लिए जब यह स्क्रिप्ट में हार्डकोड किया जाता है, या चर सेट होने के बाद एक्स सर्वर बंद हो गया था)।
n.st

6

मैं आमतौर पर उपयोग करता हूं TERM अपनी स्क्रिप्ट में X के लिए परीक्षण करने के चर का हूं।

TERMआमतौर linuxपर टीटीवाई और xtermएक्स पर सेट किया जाता है।
मैं "आमतौर पर" शब्द का उपयोग यहां करता हूं, क्योंकि जीएनयू स्क्रीन और टीएमएक्स जैसे एप्लिकेशन TERMवेरिएबल के साथ गड़बड़ करते हैं ।


echo $TERMविभिन्न कंसोल्स में अपने मैशाइन पर रिच सेटिंग का पता लगाने की कोशिश करें। मैं [ $TERM == "linux" ] && echo do some stuffउबंटू पर उपयोग करता हूं
rubo77

3

यह पूरी तरह से अच्छी तरह से काम करना चाहिए:

[ ! -t 0 ] && xset b off                                  

http://tldp.org/LDP/abs/html/fto.html

-t

    file (descriptor) is associated with a terminal device

    This test option may be used to check whether the stdin [ -t 0 ] 
    or stdout [ -t 1 ] in a given script is a terminal.

इसलिए, जब यह गलत ( [ ! -t 0 ]) के लिए मूल्यांकन करता है तो हम GUI वातावरण में हैं।


इसके साथ, मुझे X और कंसोल दोनों में समान परिणाम मिलता है, अर्थात् [ -t 0 ]और [ -t 1 ]दोनों सत्य हैं।
इमानुएल बर्ग

अजीब बात है, यह मेरे लिए काम करता है जब एक दूरस्थ होस्ट में sshing।
terdon

[ -t 0 ]उबंटू में कंसोल पर ठीक काम करता है (CTRL ALT F1 का उपयोग करके)
rubo77

0

ऐसे कई तरीके हैं जिनसे आप ऐसा कर सकते हैं।

बैश में, प्रयास करें

function xruns {
    if [[ `pstree -As $$ | grep xinit | wc -l` == 1 ]]; then
        echo "You are in X."
    else
        echo "You are not in X."
    fi
}

या, zsh में, प्रयास करें

#!/usr/bin/zsh

CURRENT_VT=`tty`

if [[ ${CURRENT_VT[6]} == "p" ]];        # or `${CURRENT_VT:5:1}` in bash
then
   # X stuff
else 
   # non-X stuff      
fi

पॉइंट लिया गया, लेकिन क्या आप पोस्ट करने से पहले अपने कोड का परीक्षण करते हैं? पहले वाले में सिंटैक्स त्रुटि है और एक्स-सत्र में यदि हम एक्स हैं तो यह पता नहीं लगाता है कि echo 1क्या एक्स चल रहा है और आप tty1-6 या ssh के माध्यम से लॉग इन करते हैं। दूसरा हमेशा "नॉन-एक्स स्टफ" करता है - मुझे लगता है कि ${CURRENT_VT[6]}इसका मतलब है कि 6 वीं पंक्ति के बजाय 6 वीं पंक्ति है।
एलोइस महदाल

@ एलिसमहदल: अहा, मेरा सामान बाश में काम नहीं करता (मैं zsh का उपयोग करता हूं)। ऐसा नहीं सोचा था। ठीक है, आप इसे zsh (प्रकार zsh) में आज़मा सकते हैं और संभवत: यदि आप इसे पसंद करते हैं, तो इसे बैश में बनाने के लिए कुछ संशोधन कर सकते हैं।
इमानुएल बर्ग

@ एलोइसमाहल: ठीक है, मैंने इसे बदल दिया। के रूप में "tty1-6 के माध्यम से लॉग इन करें", जैसा कि ऐसा होता है, यही मैं करता हूं, और फिर मैं दूसरे समाधान (ऊपर) का उपयोग करता हूं और एक चर सेट करता हूं। की जाँच करें इस .zshrc और के लिए खोज export VT। मैं लिनक्स का उपयोग करने के लिए वेरिएबल का उपयोग करता हूं जो कि वीटी / वीटी / कंसोल / टीटीआई में हूं (ज़श प्रॉम्प्ट के लिए) लेकिन एक्स में, मैं इसे "एक्स" (हालांकि वीटी नहीं) पर सेट करता हूं। लेकिन यह विवरण है, आप इसे किसी भी तरह से काम कर सकते हैं जो आप एक ही सिद्धांत का उपयोग कर सकते हैं।
इमानुएल बर्ग

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

@AloisMahdal: संपादन देखें। यह मेरे लिए है, tty सामान सहित।
इमानुएल बर्ग

0

if [[ $DISPLAY ]]

एक ही कंप्यूटर पर, एक टर्मिनल एमुलेटर में $DISPLAYउदाहरण के लिए वापस आ जाएगा 0:0, लेकिन एक वास्तविक टर्मिनल में कुछ भी नहीं। यह आसानी से CtrlAltF1बनाम के साथ परीक्षण किया जा सकता है CtrlAltF7

निम्न के bashआधार पर एक शर्त $DISPLAYइस प्रकार होगी:

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