2011-12-13 14 views
6

द्वारा उपयोग किए जाने वाले पर्यावरण चर का पता लगाएं, क्या यह पता लगाने का कोई तरीका है कि कंसोल से चलने वाले कमांड द्वारा कौन से पर्यावरण चर का उपयोग किया जाता है?लिनक्स पर्यावरण (मेरे मामले XUbuntu) में कमांड

इन चरों के बारे में पता लगाना संभव है, क्योंकि किसी को प्रोग्राम को मूल्य प्रदान करना होगा। लेकिन क्या ऐसा करने के लिए कुछ डिफ़ॉल्ट तरीका है?

यहां प्रश्न में प्रोग्राम xprintidle है।

अग्रिम धन्यवाद, जोस्ट

उत्तर

7

मान लिया जाये कि आप चर वास्तव में कुछ प्रक्रिया द्वारा प्रयुक्त एक आदेश चलाकर चाहते हैं, आप ltrace का उपयोग करें और getenv को getenv

बेशक

, तर्क करने के लिए कॉल के लिए दिखाई दे सकता है कर सकते हैं गणना कीजिए (इसलिए आप वास्तव में इसकी भविष्यवाणी नहीं कर सकते हैं)।

हालांकि, कुछ (पुराने या अजीब) अनुप्रयोग environ वैश्विक, या main पर तीसरे वैकल्पिक तर्क का उपयोग कर सकते हैं; और कुछ एप्लिकेशन putenv, setenv या unsetenv (सभी 3 libc फ़ंक्शंस हैं, शेल बिल्टिन नहीं) का उपयोग करके अपने पर्यावरण को भी बदलते हैं।

लेकिन xprintidle ज्यादातर ज़ोरग सर्वर से बातचीत कर रहा है। मुझे आश्चर्य है कि आप इसे कई पर्यावरण चर का उपयोग करने की उम्मीद कर रहे हैं (DISPLAY को छोड़कर)।

+0

ऐसा कुछ ऐसा करने का तरीका प्रतीत होता है, लेकिन एक समस्या है: getenv को कोई कॉल नहीं है, लेकिन मुझे यह सुनिश्चित करने के लिए पता है कि एक पर्यावरण चर का उपयोग किया जाता है (लाइब्रेरी कॉल में)। हालांकि, स्ट्रेस का उपयोग करके मुझे "execve ("/usr/bin/xprintidle ", [" xprintidle "], [/ * 41 vars * /])" पहले कॉल के रूप में मिलता है। क्या इसका मतलब है, चरणीय getenv के माध्यम से नहीं लाया जाता है? – Jost

+1

नहीं - 'execve() 'हमेशा प्रोग्रामों को निष्पादित करने का तरीका होता है (' execl()' और दोस्तों बस इसके ऊपर रैपर हैं), और इसका तीसरा तर्क सभी पर्यावरण चरों का सूचक सूचक है। आप इस कॉल को निष्पादित कार्यक्रम के प्रत्येक स्ट्रेस में देखेंगे। – fge

+0

मैंने ** लेट्रेस ** नहीं * स्ट्रेस * का उल्लेख किया; वे एक जैसे नहीं हैं! –

3

क्या आपका मतलब वास्तव में किसी प्रक्रिया के लिए उपयोग किया गया या परिभाषित वातावरण चर है?

परिभाषित पर्यावरण के लिए, आप उपयोग कर सकते हैं:

perl -pe 's,\00,\n,g' /proc/xxxx/environ

जहां xxxx अपनी प्रक्रिया की पीआईडी ​​है।

एक्सेस किए गए चर के लिए, आपको ltrace जैसे कुछ का उपयोग करना होगा और getenv() पर कॉल की जांच करनी होगी।

+0

' ltrace' आपकी मदद नहीं करेगा, क्योंकि वास्तव में 'getenv()' –

+0

एह कॉल करने का कोई कारण नहीं है? यदि आप किसी पर्यावरण चर के मान को एक्सेस करना चाहते हैं, तो आपको * getenv() 'कॉल करना होगा! – fge

+0

अधिकांश प्रोग्राम 'getenv' का उपयोग करके पर्यावरण तक पहुंचते हैं, इसलिए' ltrace'-ing यह आमतौर पर उपयोगी होता है लेकिन हमेशा उपयोगी नहीं होता है। मेरा जवाब देखें कुछ प्रोग्राम 'पर्यावरण' या तीसरे तर्क को 'मुख्य' का उपयोग करके पर्यावरण चर प्राप्त कर सकते हैं। बहुत कम कार्यक्रम वास्तव में ऐसा करते हैं! –

0

आप वातावरण चर की सूची चाहते हैं, तो यह है कि env

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

0

आप printenv कमांड का उपयोग करके अपने कार्यक्रम में पारित पर्यावरण चर को देख सकते हैं।

एक तरीका है कि प्रोग्राम अपने पर्यावरण को देख सकते हैं getenv कॉल का उपयोग करके, ताकि आप उस कॉल को लपेटने के लिए एक ट्रेसिंग प्रोग्राम या LD_PRELOAD चाल का उपयोग कर सकें और पता लगा सकें कि वे क्या देख रहे हैं।

हालांकि, सभी प्रोग्राम getenv का उपयोग अपने पर्यावरण को देखने के लिए नहीं करते हैं। कार्यक्रम मुख्य निम्नलिखित (असामान्य) स्वरूप का उपयोग करता है, यह envp सूचक के माध्यम से वातावरण चर देख सकते हैं:

int main(int argc, char *argv[], char *envp[]) { 
    /* ... */ 
} 

इसके अलावा, कार्यक्रमों environ चर के माध्यम से पर्यावरण के लिए उपयोग कर सकते हैं।

आपको शायद गेटेनव कॉल पर ट्रेस करके भाग्य होगा, लेकिन इसकी कोई गारंटी नहीं है --- यह प्रोग्राम से प्रोग्राम में भिन्न होता है।

संबंधित मुद्दे