गैर-लॉगिन गोले के लिए / etc / प्रोफ़ाइल क्यों नहीं मंगाया गया है?


51

लॉगिन और गैर-लॉगिन शेल के रूप में परिभाषित किया गया है:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / प्रोफ़ाइल को गैर-लॉगिन शेल के लिए आमंत्रित नहीं किया जाता है, जैसे कि जब आप konsole (kde) शुरू करते हैं। / etc / प्रोफ़ाइल केवल लॉगिन गोले के लिए आमंत्रित किया गया है।

ऐसा क्यों है? कृपया समझाएं, क्योंकि मुझे इस के औचित्य को समझना पसंद है।

जवाबों:


100

/etc/profile केवल लॉगिन शेल के लिए आमंत्रित किया जाता है क्योंकि यह इसका विशिष्ट उद्देश्य है।

आप एक आदेश इंटरैक्टिव गोले कि कर रहे हैं के लिए चलाना चाहते हैं नहीं गोले के लिए लॉग इन करें, और आप उपयोग कर रहे हैं bash, यह में डाल दिया ~/.bashrcया /etc/bash.bashrc

"प्रोफ़ाइल" फ़ाइलों का उद्देश्य उन आदेशों को समाहित करना है जो केवल लॉगिन गोले के लिए चलाया जाना चाहिए। ये फाइलें हैं:

  • /etc/profile, जब एक लॉगिन शेल के रूप में शुरू किया गया, सभी बॉर्न-संगत गोले (सहित bashऔर dash) द्वारा चलाया गया ।

  • में लिपियों /etc/profile.d

    यह बॉर्न-शैली के गोले के लिए है, लेकिन यह स्वयं निष्पादन योग्य शेल में कोडित नहीं है। बल्कि, /etc/profileउन्हें कॉल करने में कमांड करता है। उदाहरण के लिए, मेरे Ubuntu 12.04 सिस्टम पर, /etc/profileइन पंक्तियों को शामिल किया गया है:

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile उपयोगकर्ता के होम निर्देशिका में, बॉर्न-संगत शेल द्वारा चलाए जाते हैं जब एक लॉगिन शेल के रूप में शुरू किया जाता है (जब तक कि ओवरराइड नहीं किया जाता है, नीचे देखें)।

  • .bash_profileया .bash_loginउपयोगकर्ता के घर निर्देशिका में। इनके अलावा अन्य गोले द्वारा अनदेखा किया जाता है bash। लेकिन अगर .bash_profileमौजूद है, bashतो इसके बजाय इसे चलाता है .profile। यदि .bash_profileमौजूद नहीं .bash_loginहै, लेकिन मौजूद है, इसके बजाय चलाया जाता है .profile

    (लेकिन यह एक आम बात है .bash_profileया .bash_login, जब यह मौजूद है, लिखे जाने की इतनी के रूप में * स्पष्ट रूप से कॉल करने के लिए .profile।)

    शेल-विशिष्ट प्रोफ़ाइल फ़ाइलों का लाभ यह है कि उनमें कमांड या सिंटैक्स हो सकते हैं जो केवल उस शेल के लिए मान्य हैं। उदाहरण के लिए, मैं / [[में मूल्यांकन ऑपरेटर का उपयोग कर सकता हूं, लेकिन अगर मैं इसका उपयोग करता हूं और फिर अपने शेल के रूप में लॉग इन करता हूं, तो यह विफल हो जाएगा।.bash_profile.bash_login.profiledash

"प्रोफाइल" फाइलों में क्या जाना चाहिए

"प्रोफाइल" फाइलों में ऐसी कमांडें होनी चाहिए जो लॉगिन के शुरुआत में केवल एक बार चलें। (इसमें ग्राफ़िकल लॉगिन शामिल हैं, क्योंकि वे एक लॉगिन शेल के साथ शुरू करते हैं, भी।) यदि कोई शेल इंटरएक्टिव है, तो इसे चलाने वाला उपयोगकर्ता शायद लॉग ऑन है, और इसलिए इसका संभवतः एक पूर्वज है (जिसने इसे शुरू किया है, या इसे शुरू किया है, लॉग या शुरू किया है, आदि) जो एक लॉगिन शेल था।

आप केवल एक बार कमांड चलाना चाहते हैं क्योंकि:

  1. प्रति लॉगिन एक से अधिक बार चलाने का कोई कारण नहीं है, यह अक्षम होगा, या
  2. यह एक अवांछित परिणाम का उत्पादन करेगा, इसे लॉगिन के अनुसार एक से अधिक बार चलाने के लिए।

दूसरी स्थिति के उदाहरण के रूप में, जहां एक अवांछनीय परिणाम होगा, इन पंक्तियों पर विचार करें, जो प्रत्येक उपयोगकर्ता में डिफ़ॉल्ट रूप से दिखाई देते हैं ~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

मान लें कि आप SSH'd में, एक और शेल (कहते हैं zsh) चला गया, कुछ बिंदु पर पाया गया कि आप अस्थायी रूप से वापस जाना चाहते हैं, bashलेकिन अपने पर्यावरण को बनाए रखें (इसलिए bashफिर से भागे zsh), और फिर एक प्रोग्राम चलाया जैसे mcकि एक शेल भाग के रूप में इसके इंटरफ़ेस के। यदि binआपके होम फोल्डर में मौजूद है और आपका उपयोगकर्ता नाम है james, तो आपका PATHअंतरतम शेल कुछ इस प्रकार है:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

यह अक्षम है और (अधिक महत्वपूर्ण बात) यह कठिन है कि सामग्री को समझना मुश्किल है PATH

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

हर इंटरएक्टिव शेल को चलाने के लिए कमांड कहां रखें

यदि आप उपयोग कर रहे हैं bash, तो हर इंटरेक्टिव शेल में चलने वाली कमांड्स के लिए फाइलें हैं:

  • /etc/bash.bashrc
  • .bashrc उपयोगकर्ता के घर निर्देशिका में।

यह आमतौर पर आदेशों के लिए उपयोग किया जाता है

  1. शेल के केवल पर्यावरण को प्रभावित करते हैं जिसमें वे चलते हैं - बच्चे के गोले भी नहीं, या
  2. यह लॉगिन शेल नहीं होने पर भी चलना चाहिए।

उदाहरण के लिए, कमांड-लाइन टैब-समापन आम तौर पर सक्षम होना चाहिए कि bashलॉगिन शेल था या नहीं । तो यह इसमें दिखाई देता है ~/.bashrc:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

वहां, 1 और 2 दोनों लागू होते हैं: यह इस एक के अंदर चलने वाले अन्य शेल पर नहीं ले जाता है, और टैब-पूरा होने पर bashभी काम करना चाहिए , अगर मैं एक अलग शेल के साथ लॉग इन करता हूं।

लॉगइन शेल और इंटरएक्टिव नॉन-लॉगइन शेल के लिए कमांड कहां रखें

आप उपयोग कर रहे हैं bashऔर एक कमांड लॉगिन गोले और इंटरैक्टिव गोले में चलाना चाहते हैं और उस के लिए लॉग इन गोले नहीं कर रहे हैं, यह आम तौर पर में यह डाल करने के लिए पर्याप्त है /etc/bash.bashrcया~/.bashrc । ऐसा इसलिए है, क्योंकि डिफ़ॉल्ट रूप से, /etc/profileऔर ~/.profileउन्हें स्पष्ट रूप से चलाएं। उदाहरण के लिए, ~/.profileहै:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(इसी तरह, /etc/profileसूत्रों के /etc/bash.bashrcलिए bash)

इस प्रकार "प्रोफ़ाइल" और "आरसी" दोनों फाइलें चलती हैं जब आप एक इंटरेक्टिव bashशेल शुरू करते हैं (चाहे वह एक लॉगिन शेल हो या नहीं)।

नॉन-इंटरएक्टिव गोले में चलाने के लिए कमांड कहां रखें

आप शायद सभी गैर-संवादात्मक गोले चलाने के लिए कोई आदेश निर्दिष्ट नहीं करना चाहते हैं; वे हर बार एक स्क्रिप्ट चलाने के लिए चलाएंगे (बशर्ते कि स्क्रिप्ट आपके द्वारा चलाने के लिए कॉन्फ़िगर किए गए शेल द्वारा चलाई जाए)।

यह पर्याप्त टूटना पैदा कर सकता है। यदि आप ऐसा करने जा रहे हैं, और आपके द्वारा उपयोग किए जा रहे सिस्टम के अलावा सिस्टम पर कोई व्यवस्थापक खाता नहीं है, तो आप एक बनाना चाह सकते हैं; जो गलतियों को ठीक करना आसान बना सकता है।

में bash, "आर सी" फ़ाइलें वास्तव में चलाए जा रहे हैं कि क्या खोल इंटरैक्टिव है या नहीं । हालांकि, सबसे ऊपर वे कहते हैं:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

इसलिए, यदि आपको स्क्रिप्ट्स को निष्पादित करने के लिए चलने वाले गैर-संवादात्मक गोले में भी स्वचालित रूप से चलने के लिए आदेशों की आवश्यकता है, तो आप उन पंक्तियों से पहले अपने आदेश जोड़ सकते हैं ।

लॉगिन शेल शुरू करना

लॉग इन एक लॉगिन शेल शुरू करता है। यदि आप चाहते हैं कि एक शेल उसके बाद शुरू हुआ, एक लॉगिन शेल के रूप में व्यवहार करने के लिए, इसे -lध्वज के साथ प्रारंभ करें ( l ogin के लिए खड़ा है )। उदाहरण के लिए:

जब तक आप किसी अन्य उपयोगकर्ता के रूप में एक शुरू नहीं करना चाहते, तब तक लॉगिन शेल (बिना लॉग इन किए) शुरू करना सबसे अच्छा तरीका है । फिर, उपयोग करें:

  • sudo -iके लिए root( sudo -sएक गैर-लॉगिन, इंटरैक्टिव रूट शेल के लिए उपयोग करें )
  • sudo -u username -i किसी भी उपयोगकर्ता के लिए
  • su - usernameगैर- rootउपयोगकर्ताओं के लिए ( गैर-लॉगिन, इंटरेक्टिव रूट शेल के लिए उपयोग)su username

एक क्या है प्रारंभिक लॉगिन खोल?

एक प्रारंभिक लॉगिन खोल एक रूप में ही है लॉगिन खोल । हर जगह यह जवाब "लॉगिन शेल" कहता है कि यह "इनबिल्ट लॉगिन शेल" कह सकता है (इस खंड को छोड़कर, जो पहले से ही समझदारी को रोक देगा)।

इनबिल्ट लॉगिन शेल शब्द का एक कारण यह भी है कि लॉगिन शेल का उपयोग एक अलग अर्थ में भी किया जाता है - यह पहचानने के लिए कि किस प्रोग्राम को लॉग ऑन करके निष्पादित शेल के रूप में उपयोग किया जाता है। यह कहा जाता है कि लॉगिन शेल का अर्थ है :

  • " OpenBSD का डिफ़ॉल्ट लॉगिन शेल kshउबंटू में है bash।"
  • "आप अपने लॉगिन शेल को बदल सकते हैंchsh ।"

आगे की पढाई


4
किसी भी स्टैक एक्सचेंज साइट पर किसी भी सवाल का सबसे अच्छा जवाब।
मार्क ई। हासे

1
> "प्रोफाइल" फाइलों में ऐसी कमांड होनी चाहिए जो लॉगिन के शुरुआत में केवल एक बार चलें। (इसमें ग्राफ़िकल लॉगिन शामिल हैं, क्योंकि वे एक लॉगिन शेल के साथ भी शुरू करते हैं।) नहीं नहीं नहीं नहीं नहीं! यह बिल्कुल नहीं है! सभी बोर्न-जैसे गोले केवल इंटरेक्टिव लॉगिन शेल सत्रों पर पढ़े जाते हैं । यानी जो या तो -i विकल्प के साथ शुरू होते हैं, या जो एक कंट्रोलिंग टर्मिनल से जुड़े होते हैं (जिनमें से कोई भी सही नहीं है अगर शेल एक प्रदर्शन प्रबंधक द्वारा शुरू किया गया था)। यह सच है क्योंकि इस फ़ाइल का बिंदु उपयोगकर्ता के टर्मिनल को स्थापित करना है , न कि केवल उनके पर्यावरण को। यदि एक डिस्प्ले मैनेजर tr

एलियाह, मैंने डेरेक की बाकी टिप्पणियों को यहां पुन: पेश किया है लेकिन उपरोक्त स्टंप को छोड़ दिया है, इसलिए उसे आपकी उत्तर सूचना मिल जाएगी, हालांकि वह प्रतिष्ठा की आवश्यकताओं के कारण इसका जवाब नहीं दे पाएगा। मैंने उसे उपरोक्त चैटरूम तक पहुँच लिखने को दिया है।
सेठ

1
In bash, the "rc" files are actually run whether the shell is interactive or not. गलत है। /etc/bash.bashrc /etc/bash.profile द्वारा ट्रिगर किया गया है।
ठीक करें

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