दूरस्थ बैश स्रोत .bash_profile को .bashrc के बजाय क्यों करता है


24

बैश मैनुअल कहते हैं:

बैश यह निर्धारित करने का प्रयास करता है कि यह कब नेटवर्क कनेक्शन से जुड़े मानक इनपुट के साथ चलाया जा रहा है, जब दूरस्थ शेल डेमॉन द्वारा निष्पादित किया जाता है, आमतौर पर rshd, या सुरक्षित शेल डेमॉन sshd। यदि बैश यह निर्धारित करता है कि यह इस तरह से चलाया जा रहा है, तो यह ~ / .bashrc से कमांड पढ़ता है और निष्पादित करता है, यदि वह फाइल मौजूद है और पढ़ने योग्य है।

यह बैश स्रोत ~/.bashrc:

ssh user@host :

लेकिन यह बैश स्रोत ~/.bash_profile:

ssh user@host

मुझे कल्पना के अनुसार इन दोनों आदेशों में अंतर नहीं दिखता है। क्या दोनों मामलों में नेटवर्क कनेक्शन से जुड़ा स्टडिन नहीं है?


2
हालांकि यह वह नहीं है जिसके बारे में आप पूछ रहे हैं, मैं यह नोट करना चाहूंगा कि इसे .bashrc से स्रोत .bashrc के लिए अच्छा अभ्यास माना जाता है । इस तरह, .bashrc से सेटिंग इस बात पर ध्यान दिए बिना की जाएगी कि बैश को एक लॉगिन शेल या नॉन-लॉगिन शेल के रूप में शुरू किया गया है या नहीं।
इल्मरी करोनें

जवाबों:


44

एक लॉगिन शेल पहले पढ़ता है /etc/profileऔर फिर ~/.bash_profile

एक गैर लॉगिन खोल से /etc/bash.bashrcऔर फिर पढ़ता है ~/.bashrc

वह महत्वपूर्ण क्यों है?

इस पंक्ति के कारण man ssh:

यदि कमांड निर्दिष्ट है, तो इसे लॉगिन शेल के बजाय दूरस्थ होस्ट पर निष्पादित किया जाता है।

दूसरे शब्दों में, यदि ssh कमांड में केवल विकल्प हैं (कमांड नहीं), जैसे:

ssh user@host

यह एक लॉगिन शेल शुरू करेगा, एक लॉगिन शेल पढ़ता है ~/.bash_profile

एक ssh कमांड जिसमें एक कमांड है , जैसे:

ssh user@host :

जहाँ आज्ञा हो :(या कुछ न करो)।
यह एक लॉगिन शेल शुरू नहीं करेगा , इसलिए ~/.bashrcजो पढ़ा जाएगा वह होगा।


दूर का डंडा

दूरस्थ कंप्यूटर में / dev / stdin के लिए सप्लाई किया गया tty कनेक्शन वास्तविक tty या कुछ और हो सकता है।

के लिये:

$ ssh sorontar@localhost
/etc/profile sourced

$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

$ ls -la /proc/self/fd/0
lrwx------ 1 sorontar sorontar 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3

$ ls -la /dev/pts/3
crw--w---- 1 sorontar tty 136, 3 Dec 24 19:35 /dev/pts/3

टीटीवाई में समाप्त होता है (नेटवर्क कनेक्शन नहीं) जैसा कि शुरू हुआ बैश इसे देखता है।

एक कमांड के साथ ssh कनेक्शन के लिए:

$ ssh sorontar@localhost 'ls -la /dev/stdin'
sorontar@localhost's password: 
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

TTY की शुरुआत की सूची समान है, लेकिन ध्यान दें कि / etc / प्रोफ़ाइल खट्टा नहीं था।

$ ssh sorontar@localhost 'ls -la /proc/self/fd/0'
sorontar@localhost's password:
lr-x------ 1 sorontar sorontar 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]

जो शेल को बताता है कि कनेक्शन एक पाइप है (नेटवर्क कनेक्शन नहीं)।

इसलिए, दोनों परीक्षण मामलों में, शेल यह जानने में असमर्थ है कि कनेक्शन एक नेटवर्क से है और इसलिए पढ़ा नहीं जाता है ~/.bashrc(यदि हम केवल नेटवर्क के कनेक्शन के बारे में बात करते हैं)। यह ~ / .bashrc पढ़ता है, लेकिन एक अलग कारण से।


क्या नो-आर्ग का मामला भी उसके नेटवर्क इनपुट से जुड़े मानक इनपुट के साथ नहीं चल रहा है और इस प्रकार ~/.bashrcपढ़ा है?
Cyker

@ काइकर मान रहा है कि शेल stdin एक नेटवर्क से जुड़ा होगा । आप ऐसा क्यों मानते हैं? (उत्तर संपादित करें, कृपया पढ़ें)।
टोना टोटका

संपादित हिस्सा दिलचस्प है। लगता है जैसे ssh एक pty के साथ परेशान नहीं करता है जब बस एक कमांड निष्पादित होता है।
साइकर

8

आप "क्यों" नहीं "कैसे" के बारे में पूछते हैं, इसलिए मैं उस दृष्टिकोण से जवाब देने की कोशिश करूंगा। निम्नलिखित बातों के औचित्य का एक अच्छा सौदा होगा कि अतीत में हुई चीजें आज कैसे होती हैं।


दो अलग-अलग स्टार्टअप फाइलें ("प्रोफाइल" और "आरसी") होने का कारण यह है कि अतीत में मशीन पर काम करने का सामान्य तरीका है:

  1. किसी प्रकार के वास्तविक टर्मिनल या अन्य कार्य केंद्र से लॉगिन करें और एक लॉगिन शेल प्राप्त करें । यह खोल लागू करेगा /etc/profileऔर ~/.profileऔर सेटअप उपयोगकर्ता के लिए पर्यावरण।

  2. उपयोगकर्ता द्वारा दर्ज किए जाने वाले वातावरण का आह्वान करें। यह वातावरण Xorg हो सकता है, लेकिन ज्यादातर मामलों में यह बहुसंकेतक था जैसे कि GNU स्क्रीन।

  3. पर्यावरण (जैसे GNU स्क्रीन) फिर अतिरिक्त (गैर-लॉगिन) गोले लगाएगा जो पर्यावरण को मूल लॉगिन शेल से विरासत में मिला है।

उस समय जब दौरान एक UNIX मशीन में लॉग इन करने की आम तरीका था cshऔर bashविकसित किया जा रहा थे। इसलिए इसे~/.profile उन गोले में फिर से पढ़ना बेकार समझा जाता था जो पर्यावरण को विरासत में प्राप्त कर रहे थे।

bashफिर ~/.bashrcइन गैर-लॉगिन गोले के लिए अतिरिक्त कॉन्फ़िगरेशन के लिए जोड़ा गया । csh(और tcsh) ने कभी भी गैर-लॉगिन शेल के लिए किसी भी प्रकार की "आरसी" फ़ाइल नहीं जोड़ी। ध्यान दें कि csh/ tcshगोले बॉर्न शेल (जो पोसिक्स का हिस्सा है) के संगत नहीं हैं bash। एक और बॉर्न संगत शेल, kshने एक पर्यावरण चर (कहा जाता है ENV) जोड़ा , जिसे अगर परिभाषित किया गया था, तो इसे गैर-लॉगिन के लिए रन कमांड ("आरसी") फ़ाइल के रूप में उपयोग किया जाएगा ksh

तो हाँ, बोर्न शेल के नए संस्करणों ने अतिरिक्त कॉन्फ़िगरेशन फ़ाइल को उपनाम और अन्य त्वरित विकल्पों के लिए एक सुविधा के रूप में जोड़ा है जो कि जीएनयू स्क्रीन (या इसी तरह) से मेल किए गए गोले के अंदर मौजूद होंगे लेकिन आपके द्वारा दर्ज किए जाने पर प्राप्त शेल में मौजूद नहीं हैं। मशीन।

क्योंकि GDM अपनी ही प्रारंभ फ़ाइलें (जैसे होता चित्रमय प्रदर्शन प्रबंधकों (GDMs) की वृद्धि के साथ "प्रोफ़ाइल" फ़ाइलें और "आर सी" फ़ाइलों के बीच भेदभाव व्यर्थ हो गया ~/.xinitऔर ~/.xsession)। फिर, जीडीएम के अंदर से बताए गए गोले एक उपयोगकर्ता की सनक के आधार पर लॉगिन या गैर-लॉगिन गोले हो सकते हैं, और ऐसा मामला जिसमें गैर-लॉगिन शेल में हमेशा एक माता-पिता होंगे जो लॉगिन शेल है, अब और सच नहीं है।

अतिरिक्त

शेल स्टार्टअप फ़ाइल तुलना के बारे में मेरी पसंदीदा तालिकाओं में से एक यह दर्शाता है कि कैसे बोर्न शेल संगत शैल profileफाइलों का उपयोग करते हैं जबकि अन्य शेल नहीं होते हैं। इसका कारण यह है कि अतीत में प्रारंभिक शेल (जिस ने मक्सर शुरू किया था) को बोर्न संगत शेल होने की आवश्यकता थी।

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