पर्यावरण चर सेट करने के लिए सबसे अच्छा डिस्ट्रो / शेल-अज्ञेय तरीका क्या है?


31

सवाल यह सब कहता है। मैं वर्तमान में आर्क लिनक्स और zsh का उपयोग करता हूं, लेकिन मैं एक ऐसा समाधान चाहूंगा जो (न्यूनतम) वीटीएस पर और एक्सटर्म्स पर काम करता है और यह भी (उम्मीद है, अधिमानतः) काम करना जारी रखेगा अगर मैं डिस्ट्रोस या शेल स्विच करता हूं।

मैंने अलग-अलग डिस्ट्रोस डॉक्स में इस सवाल के बेतहाशा असम्बद्ध उत्तर सुने हैं। उबंटू का कहना है "उपयोग .pam_environment"। मुझे लगता है कि आर्क में वे जो सलाह देते हैं वह आपके शेल पर निर्भर करता है। वर्तमान में मैं सब कुछ। Inprofile में डाल देता हूं और यदि कोई शेल स्रोत नहीं करता है जो किसी कारण से (जैसे bash if .bash_profile मौजूद है), तो मैं इसे मैन्युअल रूप से सोर्सिंग से ओवरराइड करता हूं। लेकिन ऐसा लगता है कि एक बेहतर तरीका होना चाहिए।


2
यह डिस्ट्रो और शेल के साथ करने के लिए सब कुछ करने के लिए कुछ भी नहीं है। हालांकि, यह सुनिश्चित करने के लिए एक पोर्टेबल तरीका नहीं है।
जोसेफ आर।

हम्म। बहुत बढ़िया
स्ट्रगलर

जवाबों:


29

दुर्भाग्य से पर्यावरण चर सेट करने के लिए पूरी तरह से पोर्टेबल स्थान नहीं है। दो फाइलें जो करीब आती हैं, वे हैं~/.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फिर से स्रोत होगा ।


क्या करता case $- in *i*)है?
कोडीनिजा

2
@qodeninja निम्न निर्देशों का पालन करता है (मिलान होने तक ) ;;या esacयदि $-पैटर्न से मेल खाता है *i*, तो यदि $-इसमें शामिल है i, अर्थात यदि शेल इंटरैक्टिव है।
गिलेस एसओ- बुराई को रोकना '

$-वर्तमान में सेट शेल विकल्पों में से एक स्ट्रिंग है। (जैसे set -x)। iइंटरैक्टिव खोल का मतलब है।
पीटर कॉर्डेस

क्या आप ~/.config/envबिना उत्सर्जन के भी सिर्फ एक सामान्य फ़ाइल को स्रोत नहीं कह सकते ?
केविन सुतल ने

1
@ स्टीफनचेज़ेलस यह एक शुद्ध दृष्टिकोण है। मैं .profileकाफी पुराने बॉर्न शेल के साथ अपनी शिकायत रखता हूं , लेकिन मैं मानता हूं कि कुछ लोग सिर्फ परवाह नहीं करते हैं। मेरे पास उन लोगों के खिलाफ कुछ भी नहीं है जो अपनी फाइलों के लिए sh = bash मानते हैं, मुझे केवल तभी परवाह है अगर वे #!/bin/shस्क्रिप्ट को प्रकाशित करते हैं जो bash फीचर्स का उपयोग करते हैं।
गिलेस एसओ- बुराई को रोकना '

4

जहाँ तक मुझे पता है कि पर्यावरण चर सेट करने के लिए कोई डिस्ट्रो और शेल अज्ञेय मानक मौजूद नहीं है।

सबसे आम और वास्तविक तथ्य यह है /etc/profileऔर ~/.profile। दूसरा सबसे आम /etc/environmentऔर लगता है~/.pam_environment

यह मुझे लगता है कि सभी दस्तावेज जो मैंने पाया है वह भी आपको पहले से ही मिल गया है। मैं उन्हें अन्य पाठकों के लिए वैसे भी यहाँ सूचीबद्ध करता हूँ।

  • डेबियन अनुशंसा करता है /etc/profileऔर ~/.profile( लिंक )।
  • उबंटू अनुशंसा करता है /etc/environmentऔर ~/.pam_environment( लिंक )।
  • आर्क लिनक्स दूसरों के बीच, /etc/profileऔर /etc/environment( लिंक ) का उल्लेख करता है ।

बोनस: /etc/environmentडेबियन में उपयोग और / या दुरुपयोग का एक पाठ ( लिंक , अंतिम अद्यतन 2008)।


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

1
@JosephR। क्या अधिकांश गोले पीछे की ओर-अनुकूलता नहीं रखते हैं sh? जब तक आप POSIX से चिपके रहेंगे, मैंने सोचा होगा कि आप ठीक हो जाएंगे ...
evilsoup

1
AFAIK आप में नहीं असाइन चर कर सकते हैं cshऔर दोस्तों के POSIX रास्ता (आप की तरह कुछ की जरूरत है setया setenv)
जोसेफ आर

0

मैंने निम्नलिखित स्क्रिप्ट जोड़ा ~ ~ bin / agnostic_setenv:

#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
   echo "export $args[1]="
   exit 0
endif

if ($#args == 2) then
   if ("$args[1]" =~ *csh*) then 
      echo "setenv $args[2]"
      exit 0
   else
      echo "export $args[1]=$args[2]"
      exit 0
   endif
endif

echo "setenv $args[2] $args[3]"

और में ~ / .perl-homedir मैं उपयोग:

eval `${HOME}/bin/agnostic_setenv $shell PERL_HOMEDIR 0`

अज्ञेय_संगसेनव के लिए एक परिचित स्क्रिप्ट:

#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
   echo "export $args[1]"
   exit 0
endif

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