बैश और मछली के बीच पर्यावरण चर साझा करें


13

बैश और फिश स्क्रिप्ट संगत नहीं हैं, लेकिन मैं एक ऐसी फाइल रखना चाहूंगा, जो बैश और फिश दोनों द्वारा इनिशियलाइज़ किए जाने वाले कुछ पर्यावरण चर को परिभाषित करती हो।

मेरा प्रस्तावित समाधान एक ~/.envफ़ाइल को परिभाषित कर रहा है जिसमें पर्यावरण चर की सूची शामिल होगी जैसे:

PATH="$HOME/bin:$PATH"
FOO="bar"

मैं तो बस इसे कोसने में स्रोत बना सकता हूं और एक स्क्रिप्ट बना सकता हूं जो इसे मछली के प्रारूप और मछली में स्रोत के रूप में परिवर्तित करता है।

मैं सोच रहा था कि इससे बेहतर समाधान हो सकता है, इसलिए मैं बैश मछली के बीच पर्यावरण चर साझा करने का बेहतर तरीका पूछ रहा हूं।

नोट: मैं ओएस एक्स का उपयोग कर रहा हूं।


यहाँ एक उदाहरण .envफ़ाइल है कि मैं मछली और बाश दोनों को हास्यास्पद-मछली के सिंटैक्स का उपयोग करके संभालना चाहूंगा (मान लें ~ / बिन और ~ / बिन 2 खाली निर्देशिका हैं):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"

जवाबों:


17

बैश में पर्यावरण चर को स्थापित करने के लिए विशेष वाक्यविन्यास है, जबकि मछली एक बेसिन का उपयोग करता है। मैं सुझाव दूंगा कि आपकी .env फाइल को इस तरह लिखें:

setenv VAR1 val1
setenv VAR2 val2

और फिर setenvसंबंधित गोले में उचित रूप से परिभाषित करना । बैश में (उदाहरण .bashrc):

function setenv() { export "$1=$2"; }
. ~/.env

मछली में (जैसे config.fish):

function setenv; set -gx $argv; end
source ~/.env

ध्यान दें कि PATH को कुछ विशेष हैंडलिंग की आवश्यकता होगी, क्योंकि यह मछली में एक सरणी है लेकिन बैश में एक कोलोन सीमांकित स्ट्रिंग है। यदि आप setenv PATH "$HOME/bin:$PATH".env में लिखना पसंद करते हैं , तो आप मछली के सेटेनव को इस तरह लिख सकते हैं:

function setenv
    if [ $argv[1] = PATH ]
        # Replace colons and spaces with newlines
        set -gx PATH (echo $argv[2] | tr ': ' \n)
    else
        set -gx $argv
    end
 end

यह PATH में उन तत्वों को कुप्रभावित करेगा जिनमें रिक्त स्थान, कॉलोन या न्यूलाइन शामिल हैं।

पीएटीएच में अजीबोगरीब सच-सरणियों के साथ बृहदान्त्र-सीमांकित तारों को मिलाने के कारण होता है। मछली में पेट को जोड़ने का पसंदीदा तरीका बस है set PATH $PATH ~/bin


1
क्या PATHमछलियों के लिए फिक्सिंग के साथ पथ के साथ काम करेंगे : रिक्त स्थान? नई-पंक्तियों? अन्य बातों के लिए बाहर देखने के लिए?
टायरो

[बैश और मछली दोनों में एक बिलिन है, इसलिए PATH को उपयोग करने के लिए सही तरीके से सेट करने की आवश्यकता नहीं है [। सेटनव नमूने को कॉलन और न्यूलाइन्स को छोड़कर, पैट में सभी पात्रों के साथ काम करना चाहिए।
हास्यास्पद_फिशर

मेरे trसाथ प्रतिस्थापित करने /usr/bin/trऔर .envमेरे प्रश्न में दी गई फ़ाइल का उपयोग करने पर, मछली शुरू करते समय मुझे बहुत सारी त्रुटियां मिलती हैं। मुझे नहीं लगता कि पथ हैंडलिंग सही है।
टिलो

ओह, ठीक है, मछली इसे उद्धरणों के अंदर अलग कर देगी। मैं टिप्पणी को अपडेट करूंगा।
हास्यास्पद_फिक्स

अब यह काम करता है। मुझे नहीं लगता कि किसी अन्य शेल (मछली को छोड़कर?) को पाथ में कॉलोन के साथ वैसे भी रास्ते की अनुमति देता है।
टाइइलो

6

वहाँ (अब?) एक आसान तरीका है, प्रति @ Zanchey यहाँ जवाब है

मछली का खोल: निर्यात का उपयोग करके एक फ़ाइल से कई पर्यावरण चर कैसे सेट करें

हालांकि यह पाचन है:

मछली:

echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo

दे घुमा के:

echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo

अंतर होने $और उपयोग के साथxargs


बहुत अधिक आश्वस्त और बिना किसी विशेष वाक्यविन्यास के। धन्यवाद
Panayotis

$ PATH
JanKanis

5

अधिकांश यूनिक्स सिस्टम PAM का उपयोग करते हैं । pam_envमॉड्यूल अपने तरह बहुत ज्यादा एक फ़ाइल पढ़ता है .env

लिनक्स पर , pam_envएक सिस्टम फाइल /etc/environmentऔर एक यूजर फाइल पढ़ता है ~/.pam_environmentOS X पर (और अन्य * BSD, जो इसी तरह OpenPAM का उपयोग करते हैं), ऐसा प्रतीत होता है कि pam_envकेवल सिस्टम फ़ाइल को पढ़ता है, इसलिए आप प्रति उपयोगकर्ता चर इस तरह सेट नहीं कर सकते, केवल सभी उपयोगकर्ताओं के लिए।


1

@ हास्यास्पद के जवाब पर विस्तार करते हुए, बाश के लिए निम्न कार्य के साथ, यह उन सरणियों के लिए भी काम करता है जिनमें रिक्त स्थान होते हैं, जैसे कि $PATHआपके रास्तों में स्थान हो। हालाँकि setenvआजकल मछली मानक पुस्तकालय में एक समारोह के रूप में परिभाषित किया गया है इसलिए मैंने यहाँ नाम बदल दिया हैshenv

function shenv { 
        var="$1"
        shift
        export "$var=$(printf "%s\n" "$@" | paste -s -d: -)"
}
. ~/.env

अब अपनी .envफ़ाइल में आप setenvकमांड के लिए अलग-अलग तर्क के रूप में सरणी घटकों को निर्दिष्ट कर सकते हैं :

shenv PATH /my/path /my/path\ with\ spaces "/my/quoted path" $PATH

मछली के लिए @ हास्यास्पद_फसल का सरल कार्यान्वयन करेगा:

function shenv; set -gx $argv; end
source ~/.env

1

बस $ HOME / .config / मछली / फ़ंक्शन / env.fish में एक फ़ंक्शन बनाएं सामग्री के साथ:

for f in /etc/profile.d/*.sh
    sh $f
end

फ़ोल्डर /etc/profile.d में बैश में बनाए गए सभी संस्करणों को साझा किया

उदाहरण के लिए: /etc/profile.d/golang.sh

#!/bin/sh
export GOPATH=$HOME/gopath
export GOROOT=$HOME/go
export GOBIN=$HOME/gobin

export PATH=$PATH:$GOROOT/bin:$GOBIN

बस मछली या बैश पर लॉगिन करें, echo $GOPATH $GOROOT $GOBIN $PATHजादू करें और देखें :)

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