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 ~/.env
pliku, 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 .env
plik, 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"
źródło
PATH
poprawka dla ryb będzie działać ze ścieżkami z: spacjami? nowe linie? inne rzeczy na które trzeba uważać?[
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.tr
z/usr/bin/tr
I i korzystania z.env
pliku dostarczonego w moje pytanie, mam dużo błędów podczas uruchamiania ryby. Nie sądzę, aby obsługa PATH była poprawna.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
źródło
Większość systemów uniksowych używa PAM .
pam_env
Moduł odczytuje plik bardzo dużo jak twój.env
.W systemie Linux ,
pam_env
odczytuje plik systemowy/etc/environment
i plik użytkownika~/.pam_environment
. W OS X (i innych * BSD, które również używają OpenPAM), wygląda na to, żepam_env
czyta tylko plik systemowy, więc nie można w ten sposób ustawiać zmiennych dla użytkownika, tylko dla wszystkich użytkowników.źródło
Rozwijając odpowiedź @ ridiculous_fish, z następującą funkcją bash działa również dla tablic zawierających spacje, na przykład
$PATH
jeśli masz spacje na swoich ścieżkach. Jednaksetenv
obecnie jest już zdefiniowana jako funkcja w standardowej bibliotece ryb, więc zmieniłem tutaj nazwę nashenv
Teraz w
.env
pliku możesz określić komponenty tablic jako osobne argumenty dlasetenv
polecenia:W przypadku fish @ ridiculous_fish prosta implementacja wykona:
źródło
Wystarczy utworzyć funkcję w $ HOME / .config / fish / functions / env.fish z zawartością:
udostępnił wszystkie zmienne utworzone w bash w folderze /etc/profile.d
na przykład: /etc/profile.d/golang.sh
zaloguj się na fish lub bash, zrób
echo $GOPATH $GOROOT $GOBIN $PATH
i zobacz magię :)źródło