[-T 1] क्या जाँच करता है?


13

zshजब मैंने bashविंडोज पर शुरू किया तो मुझे शुरुआत करने का एक तरीका मिला

https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/

इसने आखिरी में निम्नलिखित कोड जोड़ने की सिफारिश की .bashrc

# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi

क्या [ -t 1 ]मतलब है?

क्या यह सिर्फ सच है?

तब, क्या मैं ऐसा कर सकता हूं?

exec zsh

जवाबों:


14

[]testकमांड का शॉर्टकट है ।

के अनुसार man test:

-t FD
True अगर FD एक फाइल डिस्क्रिप्टर है जो एक टर्मिनल से जुड़ा हुआ है।

इसलिए यदि आप बैश को इंटरएक्टिव शेल के रूप में चला रहे हैं (टर्मिनल - शब्दावली विवरण के लिए इस धागे को देखें ), बैश को zsh द्वारा प्रतिस्थापित किया जाएगा।

.Bash * फ़ाइलों के बारे में अधिक जानकारी:

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में, या - क्लोजर विकल्प के साथ एक गैर-इंटरैक्टिव शेल के रूप में लागू किया जाता है , तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है, यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में ~ / .bash_profile, ~ / .bash_login, और ~ / .profile की तलाश करता है, और जो पहले मौजूद है और पढ़ने योग्य है, उससे कमांड पढ़ता और निष्पादित करता है। जब इस व्यवहार को रोकने के लिए शेल शुरू किया जाता है - तो नोप्रोफाइल विकल्प का उपयोग किया जा सकता है।

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

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

स्टीफन चेज़लस टिप्पणी:
ध्यान दें कि शेल शेलआउट टर्मिनल के बिना इंटरएक्टिव हो सकता है, और शेल शेलआउट पर टर्मिनल के साथ गैर-इंटरैक्टिव हो सकता है (जैसे कभी भी आप अपने आउटपुट को रीडायरेक्ट / पाइपिंग किए बिना टर्मिनल के भीतर एक स्क्रिप्ट चलाते हैं) और bashकर सकते हैं .bashrcइंटरेक्टिव न होने पर भी पढ़ें (जैसे होस्ट पर उपयोगकर्ता का लॉगिन शेल ssh host cmdकहां bashहै, या bash --login -c 'some code')। case $- in *i*)...अगर शेल इंटरेक्टिव है तो टेस्ट करने का सही तरीका है।


4
ध्यान दें कि बिना शेल के टर्मिनल के बिना एक शेल इंटरएक्टिव हो सकता है, और एक शेल को स्टडआउट पर टर्मिनल के साथ गैर-इंटरएक्टिव किया जा सकता है (जैसे कि कभी भी आप किसी स्क्रिप्ट को टर्मिनल में रीडायरेक्ट / पाइपिंग के बिना उसके आउटपुट को चलाते हैं), और जब भी bashपढ़ा जा .bashrcसकता है इंटरैक्टिव (जैसे होस्ट में उपयोगकर्ता का लॉगिन शेल ssh host cmdकहां bashहै, या स्रोत bash --login -c 'some code'कहां हैं )। अगर शेल इंटरेक्टिव है तो टेस्ट करने का सही तरीका है। .bash_profile.bashrccase $- in *i*)...
स्टीफन चेज़लस

@ स्टीफनचेलजेलस अच्छी बात। मैं आपकी टिप्पणी का जवाब
mrc02_kr

"इंटरेक्टिव" की विभिन्न परिभाषाएँ हैं। यदि शेल को लगता है कि यह संवादात्मक है, तो iसेट किया जाएगा (और आधुनिक गोले ifमें जिनका उपयोग करने के बजाय परीक्षण किया जा सकता है case)। लेकिन कई उपयोग के मामले हैं जहां एक ही परवाह करता है अगर स्टडआउट (या स्टडिन, या स्टेडर ...) एक टर्मिनल से जुड़ा हुआ है।
मार्क रीड

9

परीक्षण आदेश [ -t 1 ] जाँच करता है कि पार्टी के उत्पादन एक टर्मिनल पर है। बाश के अन्य उपयोगों को बाधित किए बिना, टर्मिनल खोलते समय इस लाइन का इरादा स्पष्ट रूप से zsh को चलाने के लिए है। लेकिन यह बहुत बुरी तरह से किया गया है।

फ़ाइल .bashrcको तीन परिस्थितियों में पढ़ा जाता है:

  • जब बैश को एक इंटरैक्टिव शेल के रूप में निष्पादित किया जाता है, अर्थात बैच कमांड निष्पादित करने के बजाय उपयोगकर्ता द्वारा टाइप किए गए कमांड चलाने के लिए।
  • जब बैश एक गैर-संवादात्मक खोल होता है जो कि RSH या SSH डेमॉन द्वारा चलाया जाता है (आमतौर पर क्योंकि आप चलाते हैं ssh host.example.com somecommandऔर bash आपका लॉगिन शेल होता है host.example.com)।
  • जब यह स्पष्ट रूप से लागू किया जाता है, उदाहरण के लिए एक उपयोगकर्ता .bash_profile( स्टार्टअप फ़ाइलों का बैश विकल्प थोड़ा अजीब है )।

[ -t 1 ]इंटरैक्टिव गोले का पता लगाने के लिए एक खराब तरीका है। यह संभव है, लेकिन दुर्लभ रूप से, मानक आउटपुट के साथ इंटरैक्टिव रूप से बैश चलाने के लिए एक टर्मिनल पर नहीं जा रहा है। गैर-संवादात्मक शेल में टर्मिनल पर जाने के लिए मानक आउटपुट होना अधिक सामान्य है; एक गैर-संवादात्मक खोल में कोई व्यवसाय नहीं चल रहा है .bashrcलेकिन दुर्भाग्य से एसएसएच करते हैं। एक बेहतर तरीका है: बैश (और किसी भी अन्य श-स्टाइल शेल) इसे करने के लिए एक अंतर्निहित, विश्वसनीय तरीका प्रदान करता है।

case $- in
  *i*) echo this shell is interactive;;
  *) echo this shell is not interactive;;
esac

तो "लॉन्च zsh अगर यह एक इंटरैक्टिव शेल है" लिखा जाना चाहिए

case $- in
  *i*) exec zsh;;
esac

लेकिन यह भी एक अच्छा विचार नहीं है: यह बैश शेल को खोलने से रोकता है, जो कि ज़ीश का उपयोग करने पर भी उपयोगी होता है। इस ब्लॉग पोस्ट के बारे में भूल जाओ और इसके बजाय बस अपने शॉर्टकट को कॉन्फ़िगर करें जो बैश के बजाय zsh चलाने के लिए एक टर्मिनल खोलता है। चीजों को व्यवस्थित न करें, ताकि जब भी आप विंडोज पर बैश एप्लिकेशन खोलें, तो यह अब Zsh शेल के साथ शुरू हो जाए: "जब आप zsh चाहते हैं, तो Zsh एप्लिकेशन खोलें।


इंटरेक्टिव शेल के लिए rsh/ के sshलिए, यह एक लॉगिन शेल नहीं है। लॉगिन गोले के लिए ( sshdएक गैर-संवादात्मक लॉगिन खोल शुरू नहीं करेगा, लेकिन आप इसे कर सकते हैं ssh host exec bash -l), .bash_profileइसके बजाय पढ़ा जाता है। यह भी ध्यान दें कि rsh/ के लिए ssh, आपको भी $SHLVL
परेशान

5

आदमी 1 परीक्षण :

-टी एफडी

फ़ाइल डिस्क्रिप्टर एफडी एक टर्मिनल पर खोला जाता है

आपका उदाहरण निष्पादित होता है (इस प्रक्रिया में चल रही प्रक्रिया, इस मामले में bash) zshअगर स्टडआउट एक टर्मिनल (एक फ़ाइल / पाइप / आदि नहीं) पर खुला है।

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