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


46

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


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

जवाबों:


53

के अनुसार man bash:

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

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

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

इसके अलावा:

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

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

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

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


7
ध्यान दें कि $ - में एक i हो सकता है , जरूरी नहीं कि यह बराबर हो। मैं उपयोग करता हूँ[[ $- =~ i ]] && echo interactive
एलेक्स हावान्स्की

1
@AlexHowansky: समानता परीक्षण में तारांकन इसे युक्त करने के लिए एक परीक्षण बनाते हैंi
डेनिस विलियमसन

अरे वाह, उन पर भी ध्यान नहीं गया, वे मेरे मॉनिटर पर दोहरे उद्धरण चिह्नों की तरह दिखते हैं। यह फ़ॉन्ट आकार को बढ़ाने का समय हो सकता है। <पुराना हो रहा है>
एलेक्स हावान्स्की

कभी-कभी, लोग इसे स्रोत से ~/.bash_profileया ~/.profileजो गलत है क्योंकि यह अपेक्षित व्यवहार अधिकार के साथ हस्तक्षेप करता है । आप सोर्सिंग ~/.bashrcसे क्या समझते हैं ~/.bash_login? जैसा कि लॉगिन शेल को इंटरैक्टिव होने की आवश्यकता नहीं है मुझे लगता है कि यह गलत है, भी।
पियोट्र डोब्रोगोस्ट

1
@PiotrDobrogost: यह शेल स्टार्टअप फ़ाइलों की एक उत्कृष्ट चर्चा है।
डेनिस विलियम्सन

12

उपयोग:

if tty -s; then echo interactive; fi

काम करने के लिए प्रतीत नहीं होता
स्टीवन शॉ

यह मेरे लिए भी काम नहीं करता है, मुझे लगता है कि यह सही उत्तर है: stackoverflow.com/a/49064632/1223975
अलेक्जेंडर मिल्स

मानक इनपुट पर TTY की उपस्थिति के लिए यह जाँच करता है; यद्यपि यह संबंधित हो सकता है लेकिन यह शेल के इंटरेक्टिव मोड के समान नहीं है, जो शेल के "-i" ध्वज द्वारा इंगित किया गया है।
yrk

काम नहीं करता है। लोगों ने क्यों उकसाया?
Setop

11

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

अच्छा लगा और गोले के बीच पोर्टेबल लग रहा है। TEST यह bash <<< 'test -t 0 && echo Y || echo X'लिखता है Y, bash -c 'test -t 0 && echo Y || echo X'लिखते हैंX
kyb

1
यह भी पुष्टि करता है कि मानक इनपुट एक TTY है; यद्यपि यह संबंधित हो सकता है, लेकिन यह शेल के इंटरेक्टिव मोड के समान नहीं है, जिसे शेल के "-i" झंडे द्वारा अनुरोध और संकेत दिया गया है।
yrk

6

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

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


3
tty -s 0 का रिटर्न मान सेट करेगा यदि आप किसी टर्मिनल या 1 पर हैं तो बिना आउटपुट दिए। आप इसे 'अगर tty -s' के रूप में उपयोग कर सकते हैं; तो _interactive; फाई '
बिलहोर

धन्यवाद! यह एक लंबा समय हो गया है क्योंकि मुझे इस तरह की चीज़ करने की ज़रूरत है और मुझे लगता है कि मैं कुछ विवरण भूल गया ...
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.