कैसे एक स्वच्छ वातावरण में कार्यक्रम चलाएं?


114

मैं एक खाली वातावरण में एक कार्यक्रम चलाना चाहता हूं (यानी बिना किसी envariables सेट के)। कैसे करें यह बाश में?


जवाबों:


127

आप इसके साथ कर सकते हैं env:

env -i your_command

नीचे टिप्पणियों के विपरीत, यह पूरी तरह से पर्यावरण को साफ करता है, लेकिन यह your_commandनए चर को स्थापित करने से नहीं रोकता है । विशेष रूप से, एक शेल /etc/profileचलाने से चलाने का कारण होगा , और शेल कुछ सेटिंग्स में भी निर्मित हो सकता है।

आप इसके साथ जांच कर सकते हैं:

env -i env

यानी पर्यावरण को मिटाओ और फिर उसे छापो। आउटपुट रिक्त होगा।


4
यह पर्यावरण को पूरी तरह से साफ नहीं करता है: echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shप्रिंट /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
l0b0

2
हालाँकि, ऐसा लगता है कि यह आपके द्वारा निकटतम हो सकता है - यह वैरिएबल की तरह लगता है PATH, PWDऔर SHLVLबैश द्वारा स्वचालित रूप से सेट किया जाता है। +1।
l0b0

3
@ I0b0: मेरा संपादन देखें।
ams

3
पहले टिप्पणीकार की स्क्रिप्ट में PATH चर वातावरण में नहीं है और इसलिए पर्यावरण चर नहीं है। बैश जाहिरा तौर पर अपना नियमित शेल वैरिएबल सेट करता है जिसे PATH कहा जाता है अगर इसके लिए कोई निर्यात नहीं किया जाता है: env -i bash --norc -c "declare -p PATH"देता है declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."। नोट के लिए "-x" निर्यात (और इसलिए पर्यावरण का हिस्सा) यदि आप इसे अपने आप को निर्यात: env -i bash --norc -c "export PATH; declare -p PATH"देता हैdeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
द्विआधारी phile

34

एक "स्वच्छ" bashवातावरण के साथ हो सकता है

$ env -i bash --noprofile --norc
  • env -iआदेश आदेश निष्पादित कार्यक्रम के पर्यावरण के लिए पुराने खोल पर्यावरण के निर्यात वातावरण चर के किसी भी स्थानांतरित किए बिना कमांड लाइन पर यह करने के लिए दिया निष्पादित करता है।

  • --noprofileविकल्प बंद हो जाता है bashसिस्टम-वाइड या व्यक्तिगत खोल आरंभीकरण स्क्रिप्ट है कि अन्यथा एक लॉगिन खोल के लिए पढ़ने के लिए किया जाएगा पढ़ने से।

  • --norcविकल्प बंद हो जाता है bashव्यक्तिगत खोल आरंभीकरण स्क्रिप्ट है कि अन्यथा एक इंटरैक्टिव खोल के लिए पढ़ने के लिए किया जाएगा पढ़ने से।


मेरा एनवी उन विकल्पों को नहीं पहचानता है।
पाउलो कार्वाल्हो

@PauloCarvalho आपका सिस्टम समर्थन नहीं करता है env -i? आप किस सिस्टम पर हैं?
Kusalananda

क्षमा करें, यह शेल में काम करता है। मैंने इसे स्क्रिप्ट में डालने की कोशिश की और किसी तरह यह एक त्रुटि थी।
पाउलो कार्वाल्हो

@PauloCarvalho क्षमा करें, मैं नहीं देख सकता कि आपने क्या कमांड टाइप किया है या आपको क्या त्रुटि मिली है।
Kusalananda

महान - बस मैं क्या देख रहा था। envमेरे पर्यावरण को साफ करने के लिए, और --noprofileसोर्सिंग / आदि / प्रोफाइल और दोस्तों --norcसे बचने के लिए , और सोर्सिंग से बचने के लिए ~ / .bashrc और दोस्तों।
फेलिप अल्वारेज

28

env -i somecommandएक खाली वातावरण में एक कमांड चलाता है, जैसा कि एम्स ने पहले ही उल्लेख किया है

बहुत सारे कार्यक्रम कुछ महत्वपूर्ण पर्यावरण चर पर निर्भर करते हैं, इसलिए आप उन्हें बनाए रखना चाहते हैं:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

वैकल्पिक रूप से, आप एक छोटे लॉगिन-टाइम वातावरण में लॉग इन कर सकते हैं।

ssh localhost somecommand

1
Cmdline पर कमांड चलाते समय काम करता है। मैं कैसे कुटिया में रखते करना ?, प्रतीत नहीं होता काम !
बाल्की

अजीब बात है, मेरा नाम परिसीमन का envसमर्थन नहीं करता है --और env -i FOO=bar -- envनाम की एक कमांड चलाने का प्रयास करता है --
एंटक जूल २ ant

@antak यह env -i -- FOO=bar envवास्तव में होना चाहिए । मेरी गलती। ऐसा नहीं है कि यह तब --से उपयोगी है जब तक कि यह इसके साथ शुरू नहीं होता है -
गिल्स

एहसास नहीं था कि आप हमेशा लोकलहोस्ट में ssh कर सकते हैं, यह थोड़े अजीब है। वहां क्या उपयोग मामला है?
एडगर आरौटियूनियन

@EdgarAroutiounian यदि आप SSH सर्वर चला रहे हैं तो आप SSH को लोकलहोस्ट कर सकते हैं। प्रोग्रामर इसे मना करने के प्रयास से क्यों गुजरेंगे?
गाइल्स

4

जबकि स्वीकृत उत्तर सही है, आप आमतौर पर क्या करना चाहते हैं:

env -i bash -l -c "printenv; and any other commands"

यह आपको नंगे लेकिन कार्यात्मक बैश देता है (जैसा कि आप गैर-संवादात्मक मोड में लॉगिन करते समय प्राप्त करेंगे)। उदाहरण के लिए यह भाषा, समयक्षेत्र, गृह, आदि सेट करता है।


यह काफी काम नहीं करता है क्योंकि env -iक्लीयर HOME, जिसका मतलब है कि bash -lआपका .bash_profileआदि नहीं मिल सकता है । यदि आप एक शेल चाहते हैं जो आपको नए लॉगिन पर मिलेगा, तो आपको HOMEपहले सेट करने के लिए एक अतिरिक्त अप्रत्यक्ष की आवश्यकता होगी ।
इलियट स्लॉटर

इसका उत्तर देखें: unix.stackexchange.com/a/451389/157340
इलियट वध

1

यहाँ अधिकांश उत्तरों के साथ समस्या यह है कि यह env -iसाफ़ हो जाता है HOME, इसलिए भले ही आप bash -lअंदर की तरफ भागते हों , लेकिन यह आपके .bash_profileआदि को नहीं पढ़ेगा । इसके बजाय यह चाहते हैं:

env -i HOME="$HOME" bash -l -c 'your_command'

उदाहरण:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

1
ध्यान दें कि एक लॉगिन bashशेल चलेगा .bash_loginया .bash_profile। एक स्वच्छ वातावरण प्राप्त करने के लिए, उपयोग करें --noprofile, या HOMEएक निर्देशिका में सेट करें जिसमें उन फ़ाइलों को नहीं है। मुझे लगता है कि यह इस बात पर निर्भर करता है कि "क्लीन" से आपका क्या मतलब है।
Kusalananda

1
हां, यदि आप इसमें कुछ भी नहीं चाहते हैं, तो मूल उत्तर का पालन करें और करें env -i bash -c ...। यह उत्तर विशेष रूप से तब होता है जब आप एक शेल चाहते हैं जो ऐसा लगता है जैसे आपने मशीन पर एक नया लॉगिन किया था।
इलियट स्लॉटर

0

बाल्की की टिप्पणी का जवाब देने के लिए (और प्रक्रिया में मेरे अपने प्रश्न का उत्तर देना :-):

% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43

==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.

#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh

echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."

जब मैं CentOS 7.6 में अपनी शेलबैंग लाइन में यह कोशिश करता हूं, तो मुझे यह त्रुटि env से /usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
मिलती है

यदि मैं लंबे तर्क का उपयोग करने के लिए स्क्रिप्ट को बदलता हूं --ignore-environmentतो मुझे यह मिलता है:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.
स्कॉटज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.