Bash- und Fish-Skripte sind nicht kompatibel, aber ich hätte gerne eine Datei, die einige Umgebungsvariablen definiert, die sowohl von Bash als auch von Fish initialisiert werden sollen.
Meine vorgeschlagene Lösung besteht darin, eine ~/.env
Datei zu definieren , die die folgende Liste von Umgebungsvariablen enthält:
PATH="$HOME/bin:$PATH"
FOO="bar"
Ich könnte es dann einfach in bash ausgeben und ein Skript erstellen, das es in das Fischformat konvertiert und das in fish ausgibt.
Ich dachte, dass es eine bessere Lösung geben könnte, und fordere daher eine bessere Möglichkeit, Umgebungsvariablen zwischen Bash-Fischen auszutauschen.
Hinweis: Ich verwende OS X.
Hier ist eine Beispieldatei .env
, für die ich möchte, dass sowohl fish als auch bash die lächerliche fish-Syntax verwenden (vorausgesetzt, ~ / bin und ~ / bin2 sind leere Verzeichnisse):
setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"
quelle
PATH
Fix für Fische mit Pfaden mit: Leerzeichen? Zeilenumbrüche? andere Dinge, auf die Sie achten sollten?[
ist sowohl in Bash als auch in Fish integriert, daher sollte PATH nicht richtig eingestellt sein, um verwendet zu werden[
. Das setenv-Beispiel sollte mit allen Zeichen in PATH außer Doppelpunkten und Zeilenumbrüchen funktionieren.tr
durch/usr/bin/tr
I und Verwenden der.env
in meiner Frage angegebenen Datei werden beim Starten des Fisches viele Fehler angezeigt. Ich denke nicht, dass die PATH-Behandlung korrekt ist.Es gibt (jetzt?) Einen einfacheren Weg, wie @ Zanchey hier antwortet
Fish Shell: So legen Sie mithilfe des Exports mehrere Umgebungsvariablen aus einer Datei fest
Die Zusammenfassung ist jedoch:
Fisch:
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
mit dem Unterschied, dass
$
und die Verwendung vonxargs
quelle
Die meisten Unix-Systeme verwenden PAM . Das
pam_env
Modul liest eine Datei, die Ihrer sehr ähnlich ist.env
.Unter Linux ,
pam_env
liest eine Systemdatei/etc/environment
und eine Benutzerdatei~/.pam_environment
. Unter OS X (und anderen * BSDs, die ebenfalls OpenPAM verwenden) wird anscheinendpam_env
nur die Systemdatei gelesen, sodass Sie auf diese Weise keine Variablen pro Benutzer festlegen können, sondern nur für alle Benutzer.quelle
Wenn Sie die Antwort von @ ridiculous_fish mit der folgenden Funktion für bash erweitern, funktioniert dies auch für Arrays, die Leerzeichen enthalten, z. B.
$PATH
wenn Sie Leerzeichen in Ihren Pfaden haben. Istsetenv
jedoch in der Fischstandardbibliothek heutzutage bereits als Funktion definiert, so habe ich den Namen hier in geändertshenv
Jetzt können Sie in Ihrer
.env
Datei Array-Komponenten als separate Argumente für densetenv
Befehl angeben :Für fish @ ridiculous_fish reicht die einfache Implementierung aus:
quelle
Erstellen Sie einfach eine Funktion in $ HOME / .config / fish / functions / env.fish mit folgendem Inhalt:
hat alle in bash erstellten Variablen im Ordner /etc/profile.d freigegeben
Zum Beispiel: /etc/profile.d/golang.sh
logge dich einfach bei fish oder bash ein, mache
echo $GOPATH $GOROOT $GOBIN $PATH
und sieh dir die Magie an :)quelle