मुझे एक पर्यावरण चर कहां निर्यात करना चाहिए ताकि बैश / डैश, इंटरेक्टिव / नॉन-इंटरेक्टिव, लॉगिन / नॉन-लॉगिन के सभी संयोजनों को उठाया जा सके?


11

यहाँ प्रश्न के लिए प्रेरणा है:

मैं एकता डेस्कटॉप के साथ Ubuntu 12.04 LTS 2 का उपयोग कर रहा हूं। मेरी .bashrc फ़ाइल में, मैं अपने PATH चर में कई निर्देशिकाओं को जोड़ता हूं और कुछ पर्यावरण चर, जैसे JAVA_HOME को परिभाषित करता हूं। जब मैं एक टर्मिनल से एप्लिकेशन लॉन्च करता हूं (रनिंग बैश, मेरा डिफॉल्ट शेल), यह बहुत अच्छा काम करता है, लेकिन एकता लांचर का उपयोग करने वाले कई शॉर्टकट्स के लिए, वे ऐसे ऐप चलाते हैं जो # /! बिन / श का उपयोग करने के लिए परिभाषित होने लगते हैं। को / बिन / डैश के लिए उपनाम दिया गया है, और वे ~ / .bashrc या ~ / .profile की सामग्री नहीं उठाते हैं।

मुझे लगता है कि मैं इन सभी शॉर्टकट को / बिन / शश के बजाय / बिन / शश का उपयोग करने के लिए बदल सकता हूं। इसे .bashrc परिवर्तन लेने के लिए मजबूर कर सकता हूं, लेकिन यह वास्तव में हैकी लगता है।

यह देखते हुए कि उबंटू 12.04 (डिफ़ॉल्ट रूप से) उपनाम / बिन / श / से / बिन / डैश और यह कि मेरा डिफ़ॉल्ट शेल / बिन / बैश है, क्या कोई एकल स्थान है जहां मैं पाथ को संशोधित करने और पर्यावरण चर को परिभाषित करने का विकल्प चुन सकता हूं यदि मैं उन्हें चाहता हूं इन सभी परिस्थितियों में उपस्थित होना :

  1. जब भी मैं एक गैर-लॉगिन बैश शेल बनाता हूं (एकता में टर्मिनल का उपयोग करके)
  2. जब भी मैं एक लॉगिन बैश शेल बनाता हूं (उदाहरण के लिए, ssh पर दूरस्थ रूप से लॉगिंग)
  3. जब भी मैं एक एकता अनुप्रयोग लॉन्चर का उपयोग करता हूं (यह देखते हुए कि लॉन्चर उपयोग करता है / बिन / श)।
  4. जब भी एक क्रॉन जॉब निष्पादित होता है (दिया जाता है कि SHELL = / bin / sh / in / etc / crontab)।

अगर मैं सही तरीके से समझूं, तो मैं अनुमान लगा रहा हूं कि:

  • (1) / (2) और (3) / (4) अलग हैं क्योंकि (1) / (2) बैश हैं और (3) / (4) डैश हैं।
  • (1) और (2) अलग-अलग हैं क्योंकि बैश करने वाली फाइलें लोड करने का विकल्प चुनती हैं, यह इस बात पर निर्भर करता है कि यह लॉगिन शेल है या नहीं।
  • (3) और (4) अलग-अलग हैं क्योंकि (3) मेरे लॉग इन करने के बाद कुछ बिंदु पर आएगा (और इसलिए ~ /। लाभार्थी को इसकी मूल प्रक्रियाओं में से एक द्वारा सॉर्ट किया गया होगा, जबकि (4) कुछ पर आएगा बिंदु जब मैं लॉग इन नहीं हूं , और इसलिए ~ / .profile नहीं पढ़ा जाएगा।

(मुझे आश्चर्य नहीं होगा यदि अन्य कारक भी, जैसे कि शेल इंटरएक्टिव हो या न हो, इसलिए संभवतः अधिक संयोजन हैं जिनका मैंने अनुमान भी नहीं लगाया है ... मुझे अपने प्रश्न को सुधारने में खुशी है "" " उस स्तिथि में।)

मैं उम्मीद करूंगा कि किसी बिंदु पर, किसी ने किसी प्रकार का मार्गदर्शक बनाया होगा जो बताता है कि शेल-स्वतंत्र तरीके से पर्यावरण चर को कैसे / कहाँ संशोधित किया जाए (या कम से कम एक डैश / बैश संगत तरीके से) ... मैं बस कर सकता हूं ' ऐसा गाइड खोजने के लिए सही खोज शब्द खोजने के लिए लगता है।

समाधान या समाधान के लिए संकेत बहुत सराहना की!

अपडेट किया गया:

  • स्पष्टता: यह 12.04 इंस्टॉलेशन प्रक्रिया द्वारा बनाया गया डिफ़ॉल्ट उबंटू उपयोगकर्ता है, इसलिए फैंसी कुछ भी नहीं। यह है एक ~ / .profile (जो कि स्पष्ट रूप सूत्रों ~ / .bashrc), और केवल ~ / .bash * फ़ाइलों को पेश .bashrc, .bash_history, और .bash_logout ... इसलिए नहीं कोई .bash_profile है कर रहे हैं।
  • गुंजाइश पर जोर: मैं वास्तव में किसी भी डिफ़ॉल्ट इंटरैक्टिव खोल (बैश) और किसी भी स्क्रिप्ट को उपयोग / bin / श (पानी का छींटा के लिए उपनामित) होता है के अलावा अन्य के गोले के बारे में परवाह नहीं है, इसलिए वहाँ कुछ भी साथ इस मुश्किल की आवश्यकता नहीं है अतिरिक्त के लिए tcsh / ksh / zsh / आदि। सहयोग।

2
इसे एक फाइल में रखें और फिर अन्य आरसी फाइल को इसे सोर्स करने दें।
konsolebox

मेरे पास जो डैश मैन पेज है, उसके अनुसार, यह लॉगिन शेल के लिए $ HOME / .profile पढ़ना चाहिए।
इटन रिस्नर

@konsolebox कौन सी आरसी फाइलें हैं? AFAICT, डैश में एक आरसी फाइल नहीं है। और जैसा कि मैंने कहा, डैश ~ / .profile की सामग्री को नहीं ले रहा है।

@EtanReisner हां, और यह प्रश्न का बिंदु है। जब डैश एक लॉगिन शेल के रूप में नहीं चल रहा है (और इसलिए ~ / .profile खट्टा नहीं है), तो क्या?

@ मिकलाट आप अंतःक्रियात्मक रूप से डैश चला रहे हैं? यदि -l विकल्प को इसमें जोड़ने का प्रयास नहीं किया जाता है।
konsolebox

जवाबों:


9

शेल आह्वान एक जटिल चीज है। बैश और डैश मैन पेजों INVOCATIONमें इस बारे में अनुभाग हैं।

सारांश में वे कहते हैं (आदमी पृष्ठ में अधिक विवरण है, आपको इसे पढ़ना चाहिए):

When bash is                   | it reads
-------------------------------|----------
login shell                    | /etc/profile and then the first of ~/.bash_profile, ~/.bash_login or ~/.profile that exists.
                               |
interactive non-login shell    | /etc/bash.bashrc then ~/.bashrc
                               |
non-interactive shell          | The contents of $BASH_ENV (if it exists)
                               |
interactive (as "sh")          | The contents of $ENV (if it exists)

-

When dash is                   | it reads
-------------------------------|---------
login shell                    | /etc/profile then .profile
                               |
interactive shell              | The contents of ENV (it it exists, can be set in .profile as well as in initial environment)

मैं अन्य गोले बंद के बारे में नहीं जानता क्योंकि मैं उनमें से किसी का भी उपयोग नहीं करता। आपकी सबसे अच्छी शर्त सामान्य स्थान स्क्रिप्ट और मैन्युअल स्रोत पर इंगित करने के लिए युगल पर्यावरण चर को सेट करना हो सकता है (जो उचित हो) उन मामलों में जो कवर नहीं करते हैं।


अफसोस की बात यह है कि इस समस्या की जड़ वही है जो आपकी डैश टेबल से गायब है। जब एकता डेस्कटॉप किसी भी स्क्रिप्ट को शुरू करता है जो #! / Bin / sh से शुरू होता है, तो यह एक गैर-लॉगिन, गैर-इंटरेक्टिव डैश शेल लॉन्च करता है। तो सवाल यह है: कैसे मैं एक ही वातावरण चर उपलब्ध करवा सकता हूं वहाँ कि मैट्रिक्स में सभी जगह मौजूद हैं?

सही। मुझे लगता है कि बैश ने उस स्लॉट के लिए BASH_ENV जोड़ा है। यह देखते हुए कि डैश में कुछ भी नहीं है जो उस स्लॉट में काम करता है, मुझे यकीन नहीं है कि आप डैश के लॉन्च होने वाले एप्लिकेशन के वातावरण में परिवर्तन को प्रभावित किए बिना उस समस्या को हल कर सकते हैं (जैसे कि डैश इसे विरासत में मिला है)। इसके लिए आपके X वातावरण में सेट किए जा रहे पर्यावरण चर की आवश्यकता होती है, जहाँ .xsession (rc) @Mickalot की टिप्पणी चलन में आती है। यह अभी भी निकलता है, जैसा कि उन्होंने संकेत दिया, आइटम चार ने छोड़ दिया (लेकिन मुझे विश्वास है कि वास्तव में कुछ जानबूझकर है)।
इटन रीसनर

चूंकि मैं उबंटू 12.04 एलटीएस पर हूं, क्रोन वास्तव में पिक्सी-क्रोन है, इसलिए मैं अपने क्रॉस्टैब फ़ाइल में env चर को परिभाषित कर सकता हूं ... मैं शेल = बिन / बैश और BASH_ENV = ~ / .bbrc यह करना चाहिए?

3

तो, इसके लिए कई तरीके हैं। बहुत से लोग या तो:

ए। एक फ़ाइल है, जो आपके सभी श-शैली के गोले के लिए सामान है, कहते हैं .shcommonऔर .profile .bashrc .kshrcएट cetra में से प्रत्येक , बस इस के साथ स्रोत. .shcommon

ख। .profileअन्य फ़ाइलों से इसमें सब कुछ डालें और स्रोत करें।

विशिष्ट गोले के लिए या इंटरैक्टिव बनाम गैर-संवादात्मक गोले के लिए आवश्यक चीजें सोर्सिंग से पहले उपयुक्त फ़ाइल में जा सकती हैं .shcommon

व्यक्तिगत रूप से, मैं कई फ़ाइलों को प्रबंधित करना पसंद करता हूं। इसलिए, मैं निम्नलिखित दृष्टिकोण का उपयोग करता हूं:

सबसे पहले, मुझे जो कुछ भी चाहिए वह सब कुछ है, जिसमें .profile मुझे कुछ बाश और केश विशिष्ट चीजें हैं, मैं निम्नलिखित का उपयोग करके वर्तमान शेल नाम निर्धारित करता हूं:

# get name of current shell
# strip leading - from login shell
export SHELLNAME="${0#-}"

और फिर निम्नलिखित की तरह कुछ में विशिष्ट गोले के लिए आदेश है (कुछ एक मामले के बयान पसंद करेंगे)।

if [ "$SHELLNAME" = 'bash' ]
then
    shopt -s checkwinsize

elif [ "$SHELLNAME" = 'ksh' ]
then
    stty erase ^?
fi

यदि मेरे पास कमांड्स हैं जो केवल इंटरैक्टिव गोले में चलना चाहिए, तो मैं निम्नलिखित का उपयोग करता हूं:

# check for interactive flag i in shell options $-
# in bash and ksh you could use the following, but breaks in dash
# if [[ $- == *i* ]]
if [ "$(echo $- | grep i)" != "" ]
then
  fortune
fi

चीजें जो सभी श-शैली के गोले में आम हैं, उदाहरण के लिए, PATHबस शीर्ष पर जा सकते हैं।

फिर, मैं सभी श-शैली के गोले में इसी फ़ाइल को लोड करने के लिए सीमलिंक का उपयोग करता हूं:

ln -s .profile .bashrc
ln -s .profile .kshrc

साइड-नोट्स की एक जोड़ी, यदि आपके पास एक है .bash_profile, तो बश इसे लोड करेगा, .profileलेकिन डैश और ksh अभी भी लोड होगा .profile यह आपकी समस्या का हिस्सा हो सकता है।

जब तक आप वास्तव में POSIX संगत स्क्रिप्ट नहीं चाहते हैं #!/bin/bash, #!/bin/dashतब तक आप इसके बजाय अपनी स्क्रिप्ट में उपयोग करने पर विचार कर सकते हैं । बैश में बहुत सारी अतिरिक्त विशेषताएं होती हैं जो बहुत अच्छी होती हैं और शश के रूप में डैश या बैश इन सुविधाओं में से कई को अक्षम कर देती हैं।

इसके अलावा, बैश आदमी पेज जब समझाने का एक अच्छा काम करता है .profileकी तुलना में .bashrcलोड हो जाता है। इसी तरह के नियम ksh पर लागू होते हैं। .profileलॉगिन पर डैश लोड होता है और आपको इंटरेक्टिव गोले के स्टार्टअप पर एक फ़ाइल लोड करने की अनुमति देता है जो ENVपर्यावरण चर का उपयोग करके निर्दिष्ट किया जाता है .profile(डैश मैन पेज को भी जांचें और प्रॉफ़ाइल खोज करें)।


क्या आप केवल शेल नाम के लिए $ 0 का परीक्षण नहीं कर सकते थे? क्या ऐसे गोले / मामले हैं जो काम नहीं करते हैं?
इटन रिस्नर

इसी तरह, क्या मैं $ में जाँच करता हूं - इंटरेक्टिव शेल टेस्ट के लिए पर्याप्त नहीं है? (यह एक छोटे से अनुदान के बिना इंटरेक्टिव गोले पर ट्रिगर होगा लेकिन यह एक अवांछनीय साइड-इफ़ेक्ट हो सकता है या नहीं भी हो सकता है।)
इटन रीसनर

@ ईतन: हर्ष, मुझे पता है कि मैंने पहली बार कोशिश की $0और समस्याओं में भाग गया ... मुझे याद नहीं आ रहा है कि वे वास्तव में क्या थे। कंसोल में सीधे प्रवेश हो रहा है क्या दिखाती है $0के रूप में -bashके बजाय bashलेकिन वह ठीक किया जा सकता है।

@ ईटन: हाँ, मैं के लिए जाँच $-भी काम करेगा। मुझे इस बारे में सोचना होगा कि आपके पास बिना टेंट के एक इंटरैक्टिव शेल कब होगा? आपके समाधान में किसी कारण के लिए एक बेहतर "महसूस" होता है, मैं इसे बदल सकता हूं।

-में -bashअर्थ है "लॉगिन खोल" लेकिन हाँ आप उस के लिए खाते में स्थानों पर जहां आप मूल्य का परीक्षण या किसी और को प्रदर्शित करना चाहते हैं में की आवश्यकता होगी।
२३:११

0

चूंकि मामलों (1) और (2) को मेरे पर्यावरण चर को .bashrc और .profile में शामिल करके हल किया जाता है, इसलिए असली सवाल यह है कि "उस फ़ाइल का नाम क्या है जहां मैं इन (3) और (4) के लिए समान चर स्रोत रखता हूं।

ऐसा लगता है कि प्रश्न के भाग (3) का उत्तर है (मुझे एकता डेस्कटॉप में आयात करने के लिए पर्यावरण चर कैसे मिलता है) पूछें । सुझाव है कि एक ~ / .xsessionrc फ़ाइल बनानी है जो कि / etc / X11 / Xsession द्वारा खायी जाएगी। (मैंने इसे आज़माया है, और यह काम करने लगता है ... याय!)

मैं अभी भी (4) के लिए क्या करना है से हैरान हूँ। निश्चित रूप से, अगर मैं क्रॉन जॉब (या डेमॉन) बनाता हूं , तो मैं 'बैश-आई-सी / बिन / फू' जैसी किसी चीज के साथ '' बिन / फू '' को बदल सकता हूं, ताकि वह सही वातावरण वैरिएबल को लोड करने के लिए बैश का उपयोग करने के लिए मजबूर कर सके, लेकिन इसका अर्थ यह भी है कि मुझे किसी भी तृतीय-पक्ष टूल के साथ टिंकर करना होगा जो मेरी ओर से डेमन कार्य या क्रॉन जॉब स्थापित कर सकता है। युक।

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