Ortam değişkenlerini bash ve balık arasında paylaşma


13

bash ve fish scriptleri uyumlu değildir, ancak bash ve fish tarafından başlatılacak bazı ortam değişkenlerini tanımlayan bir dosyaya sahip olmak istiyorum.

Benim önerilen çözüm şöyle ~/.envçevre değişkenleri listesini içeren bir dosya tanımlamaktır :

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

Sonra sadece bash kaynak ve balık biçimine ve balık kaynaklarına dönüştüren bir komut dosyası yapabilir.

Bundan daha iyi bir çözüm olabileceğini düşünüyordum, bu yüzden bash balığı arasında ortam değişkenlerini paylaşmanın daha iyi bir yolunu istiyorum.

Not: OS X kullanıyorum.


Burada .envhem balık hem de bash'ın gülünç balıkların sözdizimini kullanarak işlemesini istediğiniz bir örnek dosya (~ / bin ve ~ / bin2'nin boş dizinler olduğunu varsayalım):

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

Yanıtlar:


17

bash, ortam değişkenlerini ayarlamak için özel bir sözdizimine sahipken, balık bir yerleşik kullanır. .Env dosyanızı böyle yazmanızı öneririm:

setenv VAR1 val1
setenv VAR2 val2

ve daha sonra setenvilgili kabuklarda uygun şekilde tanımlanır . Bash dilinde (örneğin. Bashc):

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

Balıklarda (örneğin, balık avı):

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

PATH'ın balıkta bir dizi olduğu, ancak bash'ta kolonla ayrılmış bir dize olduğu için özel bir işlem gerektireceğini unutmayın. setenv PATH "$HOME/bin:$PATH".Env yazmayı tercih ederseniz, balığın setenvini şöyle yazabilirsiniz:

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

Bu, PATH içindeki boşluk, iki nokta üst üste veya yeni satır içeren öğeleri yanlış kullanır.

PATH'deki gariplik, kolonla ayrılmış dizeleri gerçek dizilerle karıştırmaktan kaynaklanmaktadır. Balıklarda PATH'a eklemenin tercih edilen yolu basittir set PATH $PATH ~/bin.


1
PATHBalıklar için düzeltme aşağıdaki yollarla çalışır mı? yeni satırların? dikkat edilmesi gereken başka şeyler var mı?
Aralık'ta Tyilo

[hem bash hem de balıkta yerleşiktir, bu nedenle PATH'ın doğru şekilde ayarlanması gerekmez [. Setenv örneği, iki nokta üst üste ve yeni satırlar hariç PATH içindeki tüm karakterlerle çalışmalıdır.
ridiculous_fish

Ben trile değiştirmek /usr/bin/trve .envsorumu verilen dosyayı kullanarak, balık başlarken çok fazla hata alıyorum. PATH kullanımının doğru olduğunu düşünmüyorum.
Tyilo

Oh, doğru, balık tırnak içinde onu ayıracak. Yorumu güncelleyeceğim.
ridiculous_fish

Yay şimdi çalışıyor. Ben başka bir kabuk (balık hariç?) Zaten PATH içinde iki nokta üst üste ile yolları izin sanmıyorum.
Tyilo

6

(Şimdi?) Daha kolay bir yol var, burada @ Zanchey'nin cevabı

Fish Shell: Dışa aktarmayı kullanarak bir dosyadan birden çok ortam değişkeni nasıl ayarlanır

Bununla birlikte özet:

Balık:

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

Bash:

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

farkı $ve kullanımı ilexargs


Çok daha rahat ve özel bir sözdizimi olmadan. Teşekkür ederim
Panayotis

$ PATH
JanKanis

5

Çoğu Unix sistemi PAM kullanır . pam_envModül kardeşin gibi çok bir dosyayı okur .env.

Linux'ta , pam_envbir sistem dosyasını okur /etc/environmentve bir kullanıcı dosyayı ~/.pam_environment. OS X'te (ve aynı şekilde OpenPAM kullanan diğer * BSD'de), pam_envyalnızca sistem dosyasını okuyan görünür , böylece kullanıcı başına değişkenleri bu şekilde yalnızca tüm kullanıcılar için ayarlayamazsınız.


1

@ Ridiculous_fish'in cevabına genişleyerek, aşağıdaki bash işleviyle $PATH, yollarınızda boşluklar gibi boşluklar içeren diziler için de çalışır . Ancak setenv, günümüzde balık standart kütüphanesinde zaten bir fonksiyon olarak tanımlandığından, buradaki adıshenv

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

Şimdi .envdosyanızda dizi bileşenlerini setenvkomuta ayrı bağımsız değişkenler olarak belirtebilirsiniz :

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

Balık için @ ridiculous_fish'in basit uygulaması şunları yapacaktır:

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

1

Sadece $ HOME / .config / fish / function / env.fish içinde bir işlev oluşturun:

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

/etc/profile.d klasöründe bash içinde oluşturulan tüm varsları paylaştı

örneğin: /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

sadece balık veya bash giriş, yapmak echo $GOPATH $GOROOT $GOBIN $PATHve sihir görmek :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.