अगर टर्मिनल एमुलेटर डेस्कटॉप सत्र में चल रहा है या नहीं, तो स्क्रिप्ट का पता कैसे लगाएं?


10

मेरे पास ऐसी स्क्रिप्ट्स हैं जिन्हें मैं चलाता हूं जो एक टेक्स्ट फ़ाइल को लिखते हैं, फिर इसे एक संपादक में खोलें। अगर मैं अपने डेस्कटॉप सत्र में एक टर्मिनल एमुलेटर विंडो खोलता हूं और स्क्रिप्ट चलाता हूं, तो मैं चाहूंगा कि संपादक एक चित्रमय हो gedit। लेकिन, अगर मैं अपने फोन या इसी तरह के डेस्कटॉप सत्र से कनेक्टबॉट के माध्यम से लॉग इन हूं, तो मैं संपादक बनना चाहता हूं nano

वर्तमान में मुझे 2 अलग स्क्रिप्ट्स को बनाए रखना है, अंतिम चरण को छोड़कर (या चित्रमय एक रन, त्रुटि बंद करने दें, फिर फ़ाइल को मैन्युअल रूप से खोलें nano)। ज्यादातर दो समान लिपियाँ रखना एक रखरखाव के दृष्टिकोण से अक्षम है।

क्या कोई स्क्रिप्ट पता लगा सकती है कि मैं इनमें से किस स्थिति में हूं और सही संपादक को खोलूं?

(मुझे स्क्रिप्ट का पता लगाने के तरीके मिल गए हैं कि यह टर्मिनल एमुलेटर विंडो में चल रहा है या डबल-क्लिक किया जा रहा है, लेकिन अभी तक यह पता लगाने का कोई तरीका नहीं है कि विंडो डेस्कटॉप में चल रही है या नहीं ... मुझे नहीं लगता कि मैं Google के लिए सही शब्दावली जानिए)


6
यदि आपकी स्क्रिप्ट अन्य लोगों द्वारा उपयोग $EDITORकरने के लिए है nano, तो आपको इसके बजाय डिफ़ॉल्ट रूप से निर्दिष्ट प्रोग्राम का उपयोग करना चाहिए , और nanoयदि यह सेट नहीं है, तो इसे वापस करना चाहिए ।
बकुरीउ

धन्यवाद, महान सलाह, और यह सुनना बहुत अच्छा है कि अच्छा अभ्यास क्या है। बस मुझे हालांकि।
आर्गेनिक मार्बल

जवाबों:


13

आप $DISPLAYएक ifस्थिति के भीतर ट्रिगर के रूप में पर्यावरण चर का उपयोग कर सकते हैं। आमतौर पर जब इस चर का मान होता है तो आप ग्राफ़िकल एप्लिकेशन चलाने में सक्षम होते हैं।

यहाँ एक है उदाहरण:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

-zजब एनवार $DISPLAYखाली होगा तो ऑपरेटर सही लौटेगा और आपकी स्क्रिप्ट चलेगी nano, अन्य सभी मामलों में यह चलेगी gedit


@ Vurp0 की इस टिप्पणी के अनुसार :

अधिकांश आधुनिक वायलैंड डेस्कटॉप पर (फेडोरा और उबंटू में डिफ़ॉल्ट डेस्कटॉप की तरह), $DISPLAYअभी भी पीछे की ओर संगतता (XWayland के माध्यम से) के कारण सेट किया गया है, लेकिन अधिक मजबूत स्क्रिप्ट के लिए दोनों के लिए परीक्षण करना $DISPLAYऔर $WAYLAND_DISPLAYसुनिश्चित होना अच्छा होगा ।

मैं निम्नलिखित तरीके से परीक्षण अभिव्यक्ति को संशोधित करने का सुझाव दूंगा:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

इस प्रकार, दो चर के मूल्यों को एक सामान्य स्ट्रिंग में बदल दिया जाएगा, जिसे ऑपरेटर द्वारा संसाधित किया जाएगा -z


संदर्भ:


1
या स्पष्ट तर्क के लिए:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
अगली सूचना तक रोक दिया गया।

7

आमतौर पर आभासी टर्मिनल /dev/ptsछद्म टर्मिनलों का उपयोग करते हैं । इसलिए, ttyकमांड के आउटपुट के आधार पर , हम caseविशेष संपादक खोलने के लिए एक सरल स्टेटमेंट बना सकते हैं :

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

या अधिक अच्छी तरह से स्वरूपित:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

पर्यावरण चर का उपयोग करने की तुलना में, यह थोड़ा अधिक विश्वसनीय है और इस पर विचार करने caseसे ttyकमांड का उपयोग थोड़ा अधिक पोर्टेबल होता है। शायद सबसे अच्छा क्या होगा दोनों को अतिरिक्त परीक्षण के साथ संयोजित करना, जैसे कि"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


क्या यह गलत तरीका नहीं है? मेरे Ctrl + Alt + F1 कंसोल पर, ttyदेता है /dev/tty1, जबकि gnome-terminal(पहला टैब) देता है /dev/pts/0
धान लांडौ

@PaddyLandau हां, मामले geditमें होना चाहिए /dev/pts*। मैं उन्हें चारों ओर घुमाया, जबकि त्रुटि परीक्षण में त्रुटि और वापस स्विच किए बिना इसे कॉपी करना समाप्त कर दिया। धन्यवाद, पहले से ही संपादित।
सर्गी कोलोडियाज़नी

3

यह वही है जो मैं उपयोग कर रहा हूं:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

इस कोड का कारण यह प्रश्न था: डेस्कटॉप शॉर्टकट को बैश स्क्रिप्ट क्रैश और जलता है

आप इसे इस तरह से देख सकते हैं:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.