कैसे निर्धारित करें कि एक पर्यावरण चर कहाँ से आया है?


153

मेरे पास एक लिनक्स उदाहरण है जिसे मैंने कुछ समय पहले सेट किया था। जब मैं इसे आग लगाता हूं और लॉग इन करता rootहूं तो कुछ पर्यावरण चर होते हैं जिन्हें मैंने सेट किया है, लेकिन मुझे याद नहीं है कि वे कहां से आए थे।

  • मैं देख लिया है ~/.bash_profile, /etc/.bash_rcहै, और सभी स्टार्टअप स्क्रिप्ट।
  • मैं चला गया findऔर grepकोई फायदा नहीं हुआ।

मुझे लगता है कि मैं स्पष्ट रूप से किसी जगह को देखना भूल जाऊंगा। वहाँ यह पता लगाने के लिए एक चाल है?


6
/etc/environmentएक और है
derobert

8
और /etc/env.d/*फाइलें। लेकिन grep -R "YOUR_VARIABLE" /etc/यह पता लगाने का शायद सबसे अच्छा तरीका है।
rozcietrzewiacz


@rozcietrzewiacz सबसे सरल तरीका ... यदि चर वास्तव में / etc / (जैसे मेरे मामले में) के तहत कहीं स्थित है; यदि आप इसे उत्तर के रूप में पोस्ट करते हैं, तो मैं अपवाह करूंगा;)
लाइन

जवाबों:


55

यदि आप envचर प्रदर्शित करने के लिए कमांड का उपयोग करते हैं , तो उन्हें मोटे तौर पर उस क्रम में दिखाना चाहिए जिसमें वे बनाए गए थे। आप इसे एक गाइड के रूप में उपयोग कर सकते हैं यदि वे बूट में सिस्टम द्वारा बहुत पहले सेट किए गए थे, या बाद में .profile या अन्य कॉन्फ़िगरेशन फ़ाइल द्वारा। मेरे अनुभव में, setऔर exportआदेश वर्णमाला क्रम से उनके चर को क्रमबद्ध करेंगे, ताकि लिस्टिंग उतना उपयोगी न हो।


1
यह बहुत अच्छा है ... सिवाय इसके कि मैं यह पता लगाने की कोशिश कर रहा हूं कि पर्यावरण चर (सेट / आदि / पर्यावरण) में क्या समाशोधन है । :-) (और हाँ, इसे शुरू में सेट किया जा रहा है ... मैं स्क्रिप्ट में विभिन्न लाइनों को जोड़ने के लिए लॉग इन करने के लिए जहाँ यह साफ़ हो जाता है ...)
माइकल स्कैपर

127

यदि zshआपका लॉगिन शेल है:

zsh -xl

के साथ bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

यह एक लॉगिन शेल का अनुकरण करेगा और जो कुछ भी किया गया है उसे छोड़कर (वर्तमान में उन क्षेत्रों को दर्शाता है जहां स्टैडर को पुनर्निर्देशित किया गया है zsh) साथ ही वर्तमान में जिस फ़ाइल की व्याख्या की जा रही है।

इसलिए आपको केवल उस आउटपुट में अपने पर्यावरण चर के नाम की तलाश करनी होगी। (आप scriptपूरे शेल सत्र आउटपुट को स्टोर करने में मदद करने के लिए कमांड का उपयोग कर सकते हैं , या bashदृष्टिकोण के लिए, टर्मिनल के बजाय आउटपुट को स्टोर करने के 7> file.logबजाय उपयोग कर सकते हैं)।7>&2xtracefile.log

यदि आपका वैरिएबल वहां नहीं है, तो संभवतः शेल को स्टार्टअप पर विरासत में मिला है, इसलिए इसे PAM कॉन्फ़िगरेशन में ~/.ssh/environment, या X11 सत्र स्टार्टअप ( ~/.xinitrc, ~/.xsession) पर पढ़ी गई चीजों की तरह सेट किया गया था या आपके लॉगिन को शुरू करने वाली सेवा परिभाषा पर सेट किया गया था प्रबंधक या पहले भी कुछ बूट स्क्रिप्ट में। तब कोई find /etc -type f -exec grep -F THE_VAR {} +मदद कर सकता है।


4
प्रभावशाली और सहायक, धन्यवाद। हमारे लिए n00bs, क्या आप मोड के बारे में थोड़ा और समझाएंगे और हम उस मोड से कैसे बाहर निकलेंगे जो हमें इसमें डालता है? उदाहरण के लिए, हम इस आउटपुट को केवल पाइप नहीं कर सकते।
ज्योफ्री हेल

5
@GeoffreyHale यदि आप zsh -xl 2>&1, यानी stderr और stdout ouputs को मर्ज करते हैं , तो आप सामान्य रूप से प्राप्त कर सकते हैं।
राकेश

1
क्या fishशेल के साथ ऐसा करने का कोई तरीका है ?
निक स्वीटिंग

यहां तक ​​कि अगर मैं उपयोग करता हूं zsh -xl 2>&1, तो भी किसी तरह मैं सामान्य रूप से नहीं पकड़ सकता। जाहिरा तौर पर आउटपुट में उचित न्यूलाइन्स या कुछ और नहीं होता है।
ज़ेरुस

मुझे लगता है कि आप बस इस्तेमाल कर सकते हैं PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), फिर उस यादृच्छिक फ़ाइल पर भी grep करें।
bd1251252 14

50

पहले देखने के लिए कुछ स्थान:

प्रणाली विस्तृत

  • /etc/environment: विशेष रूप से पर्यावरण चर के लिए
  • /etc/env.d/*: पर्यावरण चर, कई फ़ाइलों में विभाजित
  • /etc/profile: सभी प्रकार की प्रारंभिक स्क्रिप्ट
  • /etc/profile.d/*: आरंभीकरण स्क्रिप्ट
  • /etc/bashrc, /etc/bash.bashrc: कार्यों और अन्य नाम के लिए

उपयोगकर्ता विशिष्ट

  • ~/.bash_profile: लॉगिन के लिए आरंभीकरण (bash-) गोले
  • ~/.bashrc: सभी इंटरैक्टिव (बैश-) गोले के लिए आरंभीकरण
  • ~/.profile: सभी गोले के लिए इस्तेमाल किया
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: गैर-बैश के गोले के लिए समान

31

@Cian सही है। उपयोग करने के अलावा findऔर grep, वहाँ नहीं है कि आप यह पता लगाने के लिए क्या कर सकते हैं कि यह कहाँ से आया है। यह जानते हुए कि यह वास्तव में एक पर्यावरण चर है, मैं आपकी खोज को / etc / और आपकी होम निर्देशिका में केंद्रित करने का प्रयास करूंगा। VARIABLEउस उपयुक्त चर से बदलें जिसे आप खोज रहे हैं:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
यह आश्चर्य की बात है कि एक उत्तर जो 'आप नहीं कर सकता' कहता है, जो 'हां आप कर सकते हैं' कहकर उत्तर से घिरा हुआ है, यहां तक ​​कि इसके कई उत्थान भी हैं।
माइकल शेपर

मुझे ऐसा कोई उत्तर दिखाई नहीं देता जो वास्तव में यह निर्धारित करने का कोई तरीका हो कि एक चर सेट किया गया था। कुछ उपयोगी सुराग हैं, लेकिन कोई भी एक-लाइनर नहीं है जो काम कर सकता है।
एंड्रयू वागनर

इस बात ने मेरा समय हल कर दिया। Thanx।
हसन रजा

@MichaelScheper "आप इसे ढूंढे बिना नहीं कर सकते"। बाद में "आप कर सकते हैं" यह वर्णित है कि इसे कैसे करना है grep
लाइन

23

आप डाल दिया set -xअपने में .profileया .bash_profile, बाद के सभी खोल आदेशों मानक त्रुटि को लॉग इन किया जाएगा और आप देख सकते हैं उनमें से एक इन चरों सेट। आप इसे ट्रेस करने set -xके /etc/profileलिए सबसे ऊपर रख सकते हैं । आउटपुट बहुत वर्बोज़ हो सकता है, इसलिए हो सकता है कि आप इसे किसी फ़ाइल की तरह रीडायरेक्ट करना चाहें exec 2>/tmp/profile.log

यदि आपका सिस्टम PAM का उपयोग करता है, तो या pam_envमें लोड अनुरोधों की तलाश करें । यह मॉड्यूल पर्यावरण चर को निर्दिष्ट फ़ाइलों से, या सिस्टम डिफ़ॉल्ट से लोड करता है यदि कोई फ़ाइल निर्दिष्ट नहीं है ( और डेबियन और उबंटू पर)। लिनक्स पर पर्यावरण चर परिभाषाओं के साथ एक और फ़ाइल है (लाइनों की शुरुआत के साथ देखें )।/etc/pam.conf/etc/pam.d/*/etc/environment/etc/security/pam_env.conf/etc/login.defsENV_


5

उन फ़ाइलों के लिए अपनी स्टार्टअप स्क्रिप्ट देखें, जिनका वे उपयोग कर रहे हैं .(डॉट) या source। वे फाइलें इसके अलावा /etcऔर निर्देशिकाओं में हो सकती हैं $HOME


2

के लिए zshउपयोगकर्ताओं, फ़ाइलों कि (स्टार्टअप के दौरान) पहुंचा जा सकता है उपयोगी हो सकता है पता लगाने, वे नहीं भी कई हैं और एक के माध्यम से उन्हें देख सकते हैं एक-एक करके जहां कुछ परिभाषित किया गया था खोजने के लिए।

zsh -o SOURCE_TRACE

0

पर्यावरण चर / etc / प्रोफाइल फ़ाइल में संग्रहीत किए जाते हैं इसलिए अधिक / etc / प्रोफ़ाइल करें और बस अपने इच्छित env चर की जाँच करें और यदि / etc / प्रोफ़ाइल मौजूद नहीं है, तो अपने घर निर्देशिका में .profile फ़ाइल के लिए lokk।


1
पर्यावरण चर में संग्रहीत नहीं होते हैं /etc/profile, आप उन्हें वहां सिस्टम को परिभाषित कर सकते हैं जैसे bashकि लॉगिन शेल के रूप में उपयोग किया जाता है। वे फ़ाइलों और / या कमांडलाइन से परिभाषाओं में पढ़ने के बाद शेल प्रक्रिया द्वारा संग्रहीत किए जाते हैं।
एंथन

-2

उदाहरण के लिए, यदि आप हिस्टीमर वैरिएबल और उसके मूल्य को खोजना चाहते हैं या जानना चाहते हैं कि इतिहास के बारे में कौन से चर को परिभाषित किया गया है तो आप इसे शेल में टाइप करेंगे:

set | grep HIST
env | grep HIST
printenv | grep HIST

यदि आप पहले से ही नाम जानते हैं, तो क्यों नहीं echo "$HISTFILE":?
जेफ स्कालर

क्योंकि, हम उस जगह को ढूंढना चाहते हैं जहाँ $ HISTFILE चर परिभाषित किया गया है। इसके अलावा, अगर मुझे पता है कि कौन से चर को अबू इतिहास के रूप में परिभाषित किया गया है
वुल अलीयेव

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