Udostępniaj zmienne środowiskowe między bash i rybami


13

Skrypty bash i fish nie są kompatybilne, ale chciałbym mieć plik, który definiuje niektóre zmienne środowiskowe inicjowane zarówno przez bash, jak i fish.

Moim proponowanym rozwiązaniem jest zdefiniowanie ~/.envpliku, który zawierałby listę zmiennych środowiskowych, takich jak:

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

Mógłbym wtedy po prostu pobrać go w bash i stworzyć skrypt, który konwertuje go na format ryb i źródła, które w fish.

Pomyślałem, że może być lepsze rozwiązanie, dlatego proszę o lepszy sposób udostępniania zmiennych środowiskowych między rybami bash.

Uwaga: używam OS X.


Oto przykładowy .envplik, który chciałbym obsłużyć zarówno fish, jak i bash przy użyciu składni ridiculous-fish (załóżmy, że ~ / bin i ~ / bin2 to puste katalogi):

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

Odpowiedzi:


17

bash ma specjalną składnię do ustawiania zmiennych środowiskowych, podczas gdy fish używa wbudowanego. Sugeruję napisanie pliku .env w następujący sposób:

setenv VAR1 val1
setenv VAR2 val2

a następnie setenvodpowiednio zdefiniować w odpowiednich powłokach. W bash (np. Bashrc):

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

W rybach (np. Config.fish):

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

Zauważ, że ŚCIEŻKA będzie wymagała specjalnego traktowania, ponieważ jest to tablica u ryb, ale ciąg znaków rozdzielany dwukropkiem. Jeśli wolisz pisać setenv PATH "$HOME/bin:$PATH"w .env, możesz napisać setenv ryby w następujący sposób:

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

Spowoduje to błędne obchodzenie się z elementami PATH, które zawierają spacje, dwukropki lub znaki nowej linii.

Niezręczność w PATH wynika z mieszania ciągów rozdzielanych dwukropkami z prawdziwymi tablicami. Preferowanym sposobem dołączenia do ŚCIEŻKI u ryb jest po prostu set PATH $PATH ~/bin.


1
Czy PATHpoprawka dla ryb będzie działać ze ścieżkami z: spacjami? nowe linie? inne rzeczy na które trzeba uważać?
Tyilo

[jest wbudowany zarówno w bash, jak i ryby, więc ŚCIEŻKA nie powinna wymagać poprawnego ustawienia, aby użyć [. Próbka setenv powinna działać ze wszystkimi znakami w zmiennej PATH, z wyjątkiem dwukropków i znaków nowej linii.
ridiculous_fish

Wymiana trz /usr/bin/trI i korzystania z .envpliku dostarczonego w moje pytanie, mam dużo błędów podczas uruchamiania ryby. Nie sądzę, aby obsługa PATH była poprawna.
Tyilo

Och, prawda, ryba rozdzieli je w cudzysłowie. Zaktualizuję komentarz.
ridiculous_fish

Tak, teraz działa. Nie sądzę, by jakakolwiek inna skorupa (oprócz ryb?) I tak dopuszczała ścieżki z dwukropkami w ŚCIEŻCE.
Tyilo

6

Jest (teraz?) Łatwiejszy sposób, na odpowiedź @ Zanchey tutaj

Fish Shell: Jak ustawić wiele zmiennych środowiskowych z pliku za pomocą eksportu

Podsumowanie to:

Ryba:

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

Grzmotnąć:

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

z tą różnicą, że $i wykorzystaniemxargs


Znacznie bardziej wygodny i bez specjalnej składni. Dziękuję
Panayotis,

Nie działa dla tablic takich jak $ PATH
JanKanis

5

Większość systemów uniksowych używa PAM . pam_envModuł odczytuje plik bardzo dużo jak twój .env.

W systemie Linux , pam_envodczytuje plik systemowy /etc/environmenti plik użytkownika ~/.pam_environment. W OS X (i innych * BSD, które również używają OpenPAM), wygląda na to, że pam_envczyta tylko plik systemowy, więc nie można w ten sposób ustawiać zmiennych dla użytkownika, tylko dla wszystkich użytkowników.


1

Rozwijając odpowiedź @ ridiculous_fish, z następującą funkcją bash działa również dla tablic zawierających spacje, na przykład $PATHjeśli masz spacje na swoich ścieżkach. Jednak setenvobecnie jest już zdefiniowana jako funkcja w standardowej bibliotece ryb, więc zmieniłem tutaj nazwę nashenv

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

Teraz w .envpliku możesz określić komponenty tablic jako osobne argumenty dla setenvpolecenia:

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

W przypadku fish @ ridiculous_fish prosta implementacja wykona:

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

1

Wystarczy utworzyć funkcję w $ HOME / .config / fish / functions / env.fish z zawartością:

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

udostępnił wszystkie zmienne utworzone w bash w folderze /etc/profile.d

na przykład: /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

zaloguj się na fish lub bash, zrób echo $GOPATH $GOROOT $GOBIN $PATHi zobacz magię :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.