.bashrc
बैश की एक कॉन्फ़िगरेशन फ़ाइल है, केवल जब इसे अंतःक्रियात्मक रूप से निष्पादित किया जाता है। यह केवल तब ही लोड होता है जब आप बैश शुरू करते हैं, न कि जब आप कुछ अन्य प्रोग्राम चलाते हैं जैसे कि sh
(भले ही बैश को नाम के माध्यम से लागू किया गया हो sh
)। और यह केवल तभी लोड किया जाता है जब बैश इंटरैक्टिव होता है, न कि जब यह स्क्रिप्ट या कमांड के साथ निष्पादित होता है -c
।
sudo sh -c 'echo $PATH'
या sudo bash -c 'echo $PATH'
एक इंटरैक्टिव शेल का आह्वान नहीं करता है, इसलिए .bashrc
शामिल नहीं है।
sudo su; echo $PATH
रूट के खोल का एक संवादात्मक उदाहरण चलाता है। यदि वह बैश है, तो ~root/.bashrc
लोड किया जाता है। यह स्निपेट echo $PATH
एक बार इस इंटरेक्टिव शेल को समाप्त कर देता है, इसलिए इंटरेक्टिव शेल में जो कुछ भी होता है उसका स्निपेट के अंत में प्रिंट करने पर कोई प्रभाव नहीं पड़ता है। लेकिन यदि आप echo $PATH
द्वारा शुरू किए गए इंटरेक्टिव शेल के संकेत पर टाइप करते हैं sudo su
, तो आप द्वारा निर्धारित मान देखेंगे ~root/.bashrc
।
चूंकि .bashrc
प्रत्येक इंटरेक्टिव शेल में इनवॉइस किया गया है, न कि लॉगिन शेल्स (इंटरेक्टिव लॉगइन शेल द्वारा भी नहीं, जो कि बैश में एक डिजाइन दोष है), यह पर्यावरण चर को परिभाषित करने के लिए गलत जगह है। का प्रयोग करें .bashrc
जैसे प्रमुख बाइंडिंग, उपनाम और पूरा सेटिंग्स के रूप में इंटरएक्टिव बैश सेटिंग्स के लिए। : फ़ाइलों को लोड किए गए हैं जब आप प्रवेश में सेट वातावरण चर ~/.pam_environment
या ~/.profile
।
तो इसके बजाय PATH
में सेट करें , और या तो के साथ एक लॉगिन शेल चलाएं , या स्पष्ट रूप से स्रोत के साथ ।.profile
.bashrc
sudo -i 'echo $PATH'
.profile
sudo sh -c '. ~/.profile; echo $PATH'