दुर्भाग्य से पर्यावरण चर सेट करने के लिए पूरी तरह से पोर्टेबल स्थान नहीं है। दो फाइलें जो करीब आती हैं, वे हैं~/.profile
, वे पारंपरिक स्थान हैं और कई सेटअपों पर बॉक्स से बाहर काम करती हैं, और ~/.pam_environment
एक आधुनिक, सामान्य लेकिन सीमित विकल्प है।
क्या अंदर डाला जाए ~/.pam_environment
फ़ाइल ~/.pam_environment
सभी लॉगिन विधियों द्वारा पढ़ी जाती है जो PAM का उपयोग करते हैं और जिनके पास यह फ़ाइल सक्षम है। यह आजकल अधिकांश लिनक्स सिस्टम को कवर करता है।
का प्रमुख लाभ ~/.pam_environment
यह है कि (जब सक्षम किया जाता है) इसे उपयोगकर्ता के शेल शुरू होने से पहले पढ़ा जाता है, इसलिए यह सत्र प्रकार, लॉगिन शेल और अन्य जटिलताओं की परवाह किए बिना काम करता है। यहां तक कि यह गैर-संवादात्मक लॉगिन जैसे su -c somecommand
और के लिए भी काम करता है ssh somecommand
।
की प्रमुख सीमा है ~/.pam_environment
यह है कि आप केवल साधारण कार्य कर सकते हैं, न कि जटिल शेल सिंटैक्स। इस फाइल का सिंटैक्स निम्नानुसार है।
- फ़ाइलों को लाइन द्वारा पार्स लाइन है।
- प्रमुख व्हाट्सएप को अनदेखा किया जाता है।
- आप वैकल्पिक रूप से लाइनों को शुरू कर सकते हैं
export
और एकल स्थान (टैब नहीं, आंकड़ा नहीं) के हैं।
- उसके बाद, प्रत्येक पंक्ति में फॉर्म होना चाहिए
VAR=VALUE
जहां VAR में अक्षर, अंक और अंडरस्कोर होते हैं।
#
टिप्पणी शुरू करता है, यह एक मूल्य में प्रकट नहीं हो सकता है।
- यदि VALUE के साथ शुरू होता है
'
या "
एक और समान उद्धरण शामिल होता है, तो VAR को उद्धरण के बीच स्ट्रिंग में सेट किया जाता है (दूसरे उद्धरण के बाद सब कुछ अनदेखा किया जाता है)। अन्यथा =
साइन के बाद VAR को स्ट्रिंग पर सेट किया जाता है ।
- यदि कोई नहीं है
=
, तो चर को पर्यावरण से हटा दिया जाता है।
तो उल्टा, ~/.pam_environment
परिस्थितियों की एक बड़ी सरणी में काम करता है। नकारात्मक पक्ष में, आपके पास किसी भी अन्य डायनामिक सेटिंग्स नहीं हो सकती हैं जैसे कि किसी अन्य चर पर चर का मान (जैसे PATH में एक निर्देशिका जोड़ना) या कमांड के आउटपुट का उपयोग करें (उदाहरण के लिए कोई निर्देशिका या प्रोग्राम मौजूद है, तो परीक्षण करें), और कुछ #'"
मूल्य में डालने के लिए अक्षर ( , न्यूलाइन) असंभव या परेशानी भरा है।
क्या अंदर डाला जाए ~/.profile
इस फ़ाइल में पोर्टेबल (POSIX) श सिंटैक्स होना चाहिए। केवल ksh या bash एक्सटेंशन (सरणियाँ [[ … ]]
, आदि) का उपयोग करें यदि आप जानते हैं कि आपके सिस्टम में ये शेल हैं/bin/sh
।
यह फ़ाइल स्वचालित अनुप्रयोगों में स्क्रिप्ट द्वारा पढ़ी जा सकती है, इसलिए इसे किसी आउटपुट या कॉल का उत्पादन करने वाले प्रोग्राम को कॉल नहीं करना चाहिए exec
। यदि आप पाठ-मोड लॉगिन पर ऐसा करना चाहते हैं, तो इसे केवल इंटरैक्टिव गोले के लिए करें। उदाहरण:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
यह /bin/sh
आपके लॉगिन शेल के रूप में उपयोग करने और आपके पसंदीदा शेल पर स्विच करने का एक उदाहरण है । यह भी देखें कि मैं अपने लॉगिन शेल के रूप में कैसे बैश का उपयोग कर सकता हूं जब मेरे sysadmin मुझे इसे बदलने देने से इनकार करते हैं
जब ~/.profile
गैर-ग्राफ़िकल लॉगिन पर नहीं पढ़ा जाता है ?
विभिन्न लॉगिन गोले विभिन्न फ़ाइलों को पढ़ते हैं।
यदि आपका लॉगिन शेल बैश है
बैश पढ़ता है ~/.bash_login
या ~/.bash_profile
यदि वे इसके बजाय मौजूद हैं ~/.profile
। बैश भी ~/.bashrc
एक लॉगिन शेल में नहीं पढ़ता है भले ही यह इंटरेक्टिव हो। फिर कभी इन विचित्रताओं को याद नहीं करना है, ~/.bash_profile
निम्नलिखित दो पंक्तियों के साथ बनाएं :
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
यह भी देखें कि बैश के साथ पर्यावरण चर स्थापित करने के लिए कौन सी सेटअप फ़ाइलों का उपयोग किया जाना चाहिए?
यदि आपका लॉगिन शेल zsh है
Zsh पढ़ता है ~/.zprofile
और ~/.zlogin
, लेकिन नहीं ~/.profile
। Zsh में श से अलग सिंटैक्स है, लेकिन ~/.profile
श एमुलेशन मोड में पढ़ सकते हैं । आप इसका उपयोग अपने लिए कर सकते हैं ~/.zprofile
:
emulate sh -c '. ~/.profile'
यह भी देखें Zsh नहीं मार ~ / .profile
यदि आपका लॉगिन शेल कुछ अन्य शेल है
बहुत कुछ आप वहां नहीं कर सकते हैं, केवल /bin/sh
आपके लॉगिन शेल और आपके पसंदीदा शेल (जैसे मछली) के रूप में उपयोग करने की कमी केवल एक इंटरैक्टिव शेल के रूप में। यही मैं zsh के साथ करता हूं। ऊपर से एक और शेल लगाने के उदाहरण के लिए ऊपर देखें ~/.profile
।
रिमोट कमांड
जब एक इंटरैक्टिव शेल के माध्यम से जाने के बिना रिमोट कमांड का उपयोग करते हैं, तो सभी शेल एक स्टार्टअप फ़ाइल नहीं पढ़ते हैं।
ENV
यदि आप इसे पास करने का प्रबंधन करते हैं, तो Ksh चर द्वारा निर्दिष्ट फ़ाइल पढ़ता है।
बैश पढ़ता है ~/.bashrc
कि क्या यह इंटरैक्टिव (!) नहीं है और इसकी मूल प्रक्रिया को कहा जाता है rshd
या sshd
। तो आप अपने शुरू कर सकते हैं ~/.bashrc
के साथ
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
ज़श हमेशा पढ़ता है ~/.zshenv
जब यह शुरू होता है। सावधानी के साथ प्रयोग करें, क्योंकि यह zsh के हर एक उदाहरण द्वारा पढ़ा जाता है, तब भी जब यह एक सबस्क्रिप्शन होता है जहां आपने अन्य चर सेट किए हैं। यदि zsh आपका लॉगिन शेल है और आप इसका उपयोग केवल दूरस्थ कमांड के लिए चर सेट करने के लिए करना चाहते हैं, तो एक गार्ड का उपयोग करें: कुछ चर सेट करें ~/.profile
, जैसे कि MY_ENVIRONMENT_HAS_BEEN_SET=yes
, और पढ़ने से पहले इस गार्ड की जाँच करें ~/.profile
।
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
ग्राफिकल लॉगिन का मामला
कई वितरण, प्रदर्शन प्रबंधक और डेस्कटॉप वातावरण चलाने की व्यवस्था करते हैं ~/.profile
, या तो स्टार्टअप स्क्रिप्ट से स्पष्ट रूप से सोर्सिंग करके या लॉगिन शेल चलाकर।
दुर्भाग्य से, डिस्ट्रो / डीएम / डे संयोजनों को संभालने के लिए कोई सामान्य तरीका ~/.profile
नहीं है जहां पढ़ा नहीं जाता है।
यदि आप द्वारा शुरू किए गए पारंपरिक सत्र का उपयोग करते हैं ~/.xsession
, तो यह वह स्थान है जहां आपको अपना पर्यावरण चर सेट करना चाहिए; सोर्सिंग ~/.profile
(यानी . ~/.profile
) द्वारा करें। ध्यान दें कि कुछ सेटअप में, डेस्कटॉप वातावरण स्टार्टअप स्क्रिप्ट ~/.profile
फिर से स्रोत होगा ।