सवाल यदि इंटरैक्टिव मोड में कोई खोल चल रहा है तो मैं बैश में कैसे जांच सकता हूं?


मैं कैसे बता सकता हूं (अंदर ~/.bashrc) अगर मैं इंटरैक्टिव मोड में चल रहा हूं, या कहूं, एसएसएच पर कमांड निष्पादित कर रहा हूं। मैं एएनएसआई एस्केप अनुक्रमों के मुद्रण से बचना चाहता हूं .bashrc अगर यह बाद वाला है।


40
2018-05-30 23:53


मूल


भागने के दृश्यों को प्रिंट करना है या नहीं, यह चुनना बेहतर है कि $ TERM मूल्य पर आधारित होना चाहिए, न कि खोल की अंतःक्रियाशीलता पर। वेरिएबल क्लाइंट टर्मिनल की क्षमताओं की पहचान करता है जो भाग है जो भागने के दृश्यों को समझता है। - yarek


जवाब:


इसके अनुसार man bash:

पीएस 1 सेट है और $ - इसमें शामिल है यदि बैश इंटरैक्टिव है, अनुमति देता है          इस राज्य का परीक्षण करने के लिए एक खोल स्क्रिप्ट या स्टार्टअप फ़ाइल।

तो आप इसका उपयोग कर सकते हैं:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

इसके अलावा:

जब एक इंटरैक्टिव खोल जो लॉगिन शेल नहीं है, तो शुरू हो जाता है          /etc/bash.bashrc और ~ / .bashrc से आदेशों को पढ़ता है और निष्पादित करता है, यदि          ये फाइलें मौजूद हैं।

इसलिए ~/.bashrc केवल इंटरैक्टिव गोले के लिए सोर्स किया जाता है। कभी-कभी, लोग इसे स्रोत करते हैं ~/.bash_profile या ~/.profile जो गलत है क्योंकि यह अपेक्षित व्यवहार में हस्तक्षेप करता है। यदि आप सामान्य कोड के रखरखाव को सरल बनाना चाहते हैं, तो आपको सामान्य कोड रखने के लिए एक अलग फ़ाइल का उपयोग करना चाहिए और इसे आरसी फाइलों से स्वतंत्र रूप से स्रोत करना चाहिए।

लॉगिन से stdout करने के लिए कोई आउटपुट नहीं है तो यह सबसे अच्छा है rc जैसे फाइलें ~/.bash_profile या ~/.profile चूंकि यह उचित संचालन में हस्तक्षेप कर सकता है rsync उदाहरण के लिए।

किसी भी मामले में, गलत कॉन्फ़िगरेशन मौजूद होने के बाद भी अंतःक्रियाशीलता का परीक्षण करना एक अच्छा विचार है।


44
2018-05-31 00:08



ध्यान दें कि $ - मई शामिल एक, जरूरी नहीं कि यह बराबर है। मैं उपयोग करता हूं [[ $- =~ i ]] && echo interactive - Alex Howansky
@AlexHowansky: समानता परीक्षण में तारांकन इसे शामिल करने के लिए एक परीक्षण बनाते हैं i - Dennis Williamson
ओह वाह ने उनको भी ध्यान नहीं दिया, वे मेरे मॉनीटर पर डबल कोट्स की तरह दिखते हैं। यह फ़ॉन्ट आकार का समय हो सकता है। <पुराना हो रहा है> - Alex Howansky
कभी-कभी, लोग इसे स्रोत करते हैं ~/.bash_profile या ~/.profile जो गलत है क्योंकि यह अपेक्षित व्यवहार में हस्तक्षेप करता है सही। सोर्सिंग के बारे में आप क्या सोचते हैं ~/.bashrc से ~/.bash_login? चूंकि लॉगिन खोल को इंटरैक्टिव होने की आवश्यकता नहीं है, मुझे लगता है कि यह भी गलत है। - Piotr Dobrogost
@PiotrDobrogost: यह एक अति उत्कृष्ट विचार-विमर्श खोल स्टार्टअप फाइलों के। - Dennis Williamson


उपयोग:

if tty -s; then echo interactive; fi

11
2018-06-03 10:50



काम नहीं लग रहा है - Steven Shaw
यह मेरे लिए काम नहीं करता प्रतीत होता है, मुझे लगता है कि यह सही जवाब है: stackoverflow.com/a/49064632/1223975 - Alexander Mills
यह मानक इनपुट पर एक टीटीवी की उपस्थिति के लिए जांच करता है; हालांकि यह संबंधित हो सकता है लेकिन यह शैल के इंटरैक्टिव मोड के समान नहीं है, जिसे शैल के "-i" ध्वज द्वारा इंगित किया जाता है। - yarek


test उपकरण इसके लिए जांच सकता है (मैन पेज से):

 -t FD          True if FD is opened on a terminal.

तो आप उदाहरण के लिए उपयोग कर सकते हैं:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

या

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

8
2018-02-02 13:12



अच्छा लगता है और गोले के बीच पोर्टेबल लगता है। झसे आज़माओ bash <<< 'test -t 0 && echo Y || echo X' लिखते हैं Y, bash -c 'test -t 0 && echo Y || echo X' लिखते हैं X - kyb
यह भी सत्यापित करता है कि मानक इनपुट एक टीटीवी है; हालांकि यह संबंधित हो सकता है लेकिन यह शैल के इंटरैक्टिव मोड के समान नहीं है, जिसे अनुरोध किया जाता है और शैल के "-i" ध्वज द्वारा इंगित किया जाता है। - yarek


मैं आमतौर पर कार्यक्रम tty के आउटपुट को देखते हैं।

यदि आप एक टीटी पर हैं, तो यह आपको बताएगा कि आप किस टीटी पर हैं। यदि आप इंटरैक्टिव मोड में नहीं हैं, तो यह आम तौर पर आपको "टीटीई" जैसी कुछ नहीं बताएगा।


6
2018-05-30 23:54



यदि आप टर्मिनल पर हैं या अन्यथा आउटपुट देने के बिना अन्यथा tty -s 0 का रिटर्न वैल्यू सेट करेगा। आप इसे 'if tty -s' के रूप में उपयोग कर सकते हैं; फिर _ इंटरैक्टिव; फाई ' - BillThor
धन्यवाद! यह एक रहा है लंबा समय के बाद से मुझे इस तरह की चीज करने की ज़रूरत है और मुझे लगता है कि मैं कुछ विवरण भूल गया ... - chris