पाथ चर को बश में सेट करने का पूरा दृश्य


17

मैं स्थानों है कि के एक जोड़े में पढ़ा है PATHमें सेट है /etc/profileया .profileफ़ाइल है कि के घर निर्देशिका में।

क्या ये एकमात्र ऐसे स्थान हैं जहाँ से रास्ता तय किया गया है? मैं इसकी बेहतर समझ चाहता हूं।

में /etc/profileफ़ाइल है, तो निम्न टिप्पणी कहते हैं "system-wide .profile file for the Bourne shell"। क्या इसका मतलब यह है कि प्रोफ़ाइल फ़ाइलें बैश के लिए मुख्य कॉन्फ़िगरेशन फ़ाइलें हैं?

उस फ़ाइल में मुझे वह PATHसंस्करण बिल्कुल भी दिखाई नहीं दे रहा है । में .profileघर निर्देशिका में फाइल इस लाइन नहीं है:

PATH="$HOME/bin:$PATH"

यह PATHलग रहा है द्वारा रीसेट कर रहा है क्योंकि यह सही के $PATHसाथ पहले से ही सेट स्ट्रिंग को समाप्‍त कर रहा $HOME/bin:है? लेकिन अगर etc/profileऔर ~/.profileकेवल फाइलें सेट की गई हैं, तो कोड की उस पंक्ति में PATHकहां से $PATHआ रही है अगर इसे परिभाषित नहीं किया गया है /etc/profile?

क्या कोई अनुभवी व्यक्ति कृपया PATHचर का विस्तृत और विस्तृत विवरण दे सकता है ? धन्यवाद!

जवाबों:


20

कई जगह हैं जहां PATHसेट किया जा सकता है।

loginकार्यक्रम के एक डिफ़ॉल्ट मान पर यह तय करता है। यह डिफ़ॉल्ट मान कैसे कॉन्फ़िगर किया गया है यह सिस्टम-निर्भर है। अधिकांश गैर-एम्बेडेड लिनक्स सिस्टम पर, यह /etc/login.defsरूट और अन्य उपयोगकर्ताओं के लिए विभिन्न मूल्यों के साथ लिया जाता है । login(1)अपने सिस्टम पर मैनुअल से सलाह लें कि वह क्या करता है।

पीएएम का उपयोग करने वाली प्रणालियों पर , विशेष रूप से pam_envमॉड्यूल, पर्यावरण चर को सिस्टम-वाइड फ़ाइल /etc/environmentऔर प्रति-उपयोगकर्ता फ़ाइल में सेट किया जा सकता है ~/.pam_environment

फिर लॉग-इन (लेकिन क्रॉन जॉब्स नहीं) करने के अधिकांश तरीके एक लॉगिन शेल निष्पादित करते हैं जो सिस्टम-वाइड और प्रति-उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइलों को पढ़ता है। ये फाइलें PATHआम तौर पर प्रविष्टियों को जोड़ने के लिए, लेकिन कभी-कभी अन्य तरीकों से मूल्य को संशोधित कर सकती हैं। कौन सी फाइलें पढ़ी जाती हैं यह इस बात पर निर्भर करता है कि लॉगिन शेल क्या है। बॉर्न / POSIX- शैली के गोले पढ़े /etc/profileऔर ~/.profile। बैश पढ़ता है /etc/profile, लेकिन प्रति-उपयोगकर्ता फ़ाइल के लिए यह केवल पहले मौजूदा फ़ाइल को पढ़ता है ~/.bash_profile, ~/.bash_loginऔर ~/.profile। Zsh पढ़ता है /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zloginऔर ~/.zlogin। कई GUI सत्र लोड करने /etc/profileऔर व्यवस्थित करने की व्यवस्था करते हैं ~/.profile, लेकिन यह प्रदर्शन प्रबंधक, डेस्कटॉप वातावरण या अन्य सत्र स्टार्टअप स्क्रिप्ट पर निर्भर करता है, और प्रत्येक वितरण ने इन्हें कैसे सेट किया है।


4

प्रारंभिक PATH वैरिएबल आमतौर पर /etc/profile कभी-कभी सेट किया जाता है कभी-कभी एक sys एडमिन भी PATH वैरिएबल को स्रोत में डाल देगा/etc/profile.d

ये सिस्टम PATH var हैं जिन्हें हर कोई डिफ़ॉल्ट रूप से विरासत में लॉग इन करता है (जब तक कि स्थानीय रूप से ओवर-राइड नहीं किया जाता)। यह आमतौर पर स्पष्ट रास्तों को निर्धारित करता है, जैसे /usr/bin, हालांकि मेरी नौकरी पर हम /optबड़े पैमाने पर और कुछ कस्टम स्थानों का उपयोग करते हैं, इसलिए वे वहां भी सेट होते हैं।

प्रति उपयोगकर्ता लॉगिन आधार खातों पर, PATH को भी परिभाषित किया जा सकता है ~/.profile। यह उन चीजों को परिभाषित कर सकता है, जिनकी सभी उपयोगकर्ताओं तक पहुंच नहीं है; हो सकता है कि विभाग प्रमुख बायनेरी चला सकते हैं, /optलेकिन अन्य उपयोगकर्ता उन बायनेरिज़ से परेशान नहीं हैं। उपयोगकर्ता उस फ़ाइल को स्वयं भी संशोधित कर सकते हैं, और इसके बारे में अच्छी बात .profileयह है कि यह शेल-विशिष्ट नहीं है; यदि आप लॉगिन करते हैं, तो वहां सेट किया गया पैठ खट्टा हो जाता है।

खोल विशेष लॉगिन के लिए, पथ में परिभाषित किया जा सकता ~/.bash_profile, ~/.bashrcया .cshrc, या इसी तरह। यदि वे विशिष्ट गोले के लिए विशिष्ट पथ चाहते हैं, या यदि वे केवल अपनी सभी व्यक्तिगत प्राथमिकताओं को बनाए रखने के लिए ऐसा करते हैं, तो उपयोगकर्ता यहां पाथ सेट कर सकते हैं।

सारांश में: / etc / प्रोफ़ाइल और /etc/profile.d पारंपरिक रूप से सेटिंग कास्केडिंग कर रहे हैं; वे विरासत में मिलते हैं और आमतौर पर व्यक्तिगत डॉट-फ़ाइलों में जोड़े जाते हैं (हालांकि एक उपयोगकर्ता इसके बजाय उन्हें ओवरराइड करने के लिए चुन सकता है)। व्यक्तिगत डॉट-फाइलें आमतौर पर एक उपयोगकर्ता द्वारा निर्धारित की जाती हैं।

बेशक, शेल में पर्यावरण चर भी हैं, इसलिए स्थानीय वातावरण चर भी किसी भी कॉन्फ़िगरेशन फ़ाइल में डिफ़ॉल्ट पथ जोड़ या ओवरराइड कर सकता है।


मैंने अभी उन सभी फ़ाइलों की जाँच की है जिनका आपने उल्लेख किया है, ~ / .bash_profile और .cshrc हालांकि मौजूद नहीं हैं। /Etc/profile.d dir: appmenu-qt5.sh, bash_completion.sh & vte.sh में 3 स्क्रिप्ट फ़ाइलें PATH वैरिएबल को सेट नहीं करती हैं। "शेल का पर्यावरण चर भी है" से आपका क्या मतलब है द्विआधारी / बिन / बैश कार्यक्रम में डिफ़ॉल्ट पैठ सेट है? जब मैं $ पाथ $ गूंजता हूं तो मुझे मिलता है: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: usr / local / games लेकिन मुझे इस बात का अंदाजा नहीं है कि वास्तव में यह सब कहां सेट किया जा रहा है।
लैरी लॉलेस

मुझे लगता है कि मैंने आपके प्रश्न को कुछ हद तक गलत समझा, मैंने सोचा कि आप सभी स्थानों के लिए पूछ रहे थे कि पैट को सेट किया जा सकता है, लेकिन मुझे लगता है कि आप जहां पीएटीएच शुरू में सेट हैं वहां अधिक रुचि रखते हैं । उसके लिए, देखो /etc/bashrc। यह निर्धारित करता है कि BASH कैसे लॉन्च किया गया है, जिसमें सभी प्रारंभिक पर्यावरण चर शामिल होने चाहिए। मेरे सिस्टम पर, से /etc/bashrcपढ़ता है, /etc/profile.dलेकिन ऐसा लगता है कि आपके पास केवल 3 फाइलें हैं /etc/profile.dताकि आपका डिस्ट्रो इसे अलग तरीके से कर रहा हो।
कलुआतु वॉन श्लेकर 20

1
मैं मूल रूप से भारतीय नौसेना पोत और इसके बारे में जानना चाहता हूं। काश केन थॉम्पसन मेरे पिता थे :)
लैरी लॉलेस

तुम वहाँ पहुँचोगे। मेरा विश्वास करो, जब आप कुछ समय के लिए दैनिक आधार पर इस सामान का उपयोग करते हैं, तो यह सब में डूबना शुरू हो जाता है, और जब तक आप पूछते हैं "क्यों?" और उत्तरों के लिए डॉक्स पढ़ना, आप अंततः बहुत कुछ सीखते हैं!
कालातु वॉन श्लाकेर

लिनक्स टकसाल 18 में दालचीनी को /etc/profile.d/jdk_home.sh को जांचना सुनिश्चित करें। मैंने इस फ़ाइल का नाम बदलकर jdk_home.sh.old कर दिया है और अब मेरा पथ अतिव्यापी नहीं हो रहा है और मैं जावा-वर्सन को कॉल कर सकता हूं और जावा 9 को देख सकता हूं। अपेक्षित होना। भले ही मैंने जावा -9 को अपडेट-एटरनिटीज़ में सही ढंग से चुना हो --config java इस jdk_home.sh फ़ाइल को $ PATH
फ्लायिंगप्रिंटर

3

अन्य उत्तरों में जोड़ने के लिए:

bashसेट हो जाएगा PATHएक हार्ड-कोडेड डिफ़ॉल्ट मान पर अगर यह वातावरण में सेट नहीं है। एक Ubuntu सर्वर 16.04.2 मशीन पर, मुझे मिलता है:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

हम जांच सकते हैं कि यह मान वास्तव में हार्ड-कोडेड है, और stringsउपयोगिता का उपयोग करके पर्यावरण या कुछ फ़ाइल से नहीं पढ़ा गया है:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

हालाँकि, मुझे अपने Arch Linux मशीन पर एक अलग परिणाम मिलता है:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

इसलिए, ऐसा लगता है कि यह डिफ़ॉल्ट उस समय चुना गया है जब bashबाइनरी का निर्माण किया गया था, जो उपयोग में ओएस / वितरण पर निर्भर करता है।


0

सामान, कि मैं नहीं देख रहा हूँ:

केन थॉम्पसन के लिए आपको आश्चर्य हो सकता है: "लिनक्स पर दृश्य"

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