Condividi le variabili di ambiente tra bash e fish


13

Gli script bash e fish non sono compatibili, ma vorrei avere un file che definisce alcune variabili d'ambiente che devono essere inizializzate sia da bash che da fish.

La mia soluzione proposta consiste nel definire un ~/.envfile che contenga l'elenco delle variabili di ambiente in questo modo:

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

Potrei quindi semplicemente procurarlo in bash e creare una sceneggiatura che lo converta in formato di pesce e fonti che in pesce.

Stavo pensando che potrebbe esserci una soluzione migliore di questa, quindi sto chiedendo un modo migliore di condividere le variabili di ambiente tra pesci bash.

Nota: sto usando OS X.


Ecco un .envfile di esempio che vorrei che sia fish che bash gestissero usando la sintassi del pesce ridicolo (supponiamo che ~ / bin e ~ / bin2 siano directory vuote):

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

Risposte:


17

bash ha una sintassi speciale per impostare le variabili di ambiente, mentre fish usa un builtin. Suggerirei di scrivere il tuo file .env in questo modo:

setenv VAR1 val1
setenv VAR2 val2

e quindi definendo in modo setenvappropriato nelle rispettive shell. In bash (es. .Bashrc):

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

Nel pesce (es. Config.fish):

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

Nota che PATH richiederà un trattamento speciale, dal momento che è un array nei pesci ma una stringa delimitata da due punti in bash. Se preferisci scrivere setenv PATH "$HOME/bin:$PATH"in .env, potresti scrivere setenv di pesce in questo modo:

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

Ciò gestirà in modo errato elementi nel PERCORSO che contengono spazi, due punti o nuove righe.

L'imbarazzo in PATH è dovuto al mescolare stringhe delimitate da due punti con array reali. Il modo preferito di aggiungere al PERCORSO nei pesci è semplicemente set PATH $PATH ~/bin.


1
La PATHcorrezione per i pesci funzionerà con percorsi con: spazi? a capo? altre cose da cercare?
Tyilo,

[è integrato sia in bash che in fish, quindi PATH non dovrebbe essere impostato correttamente per l'uso [. L'esempio setenv dovrebbe funzionare con tutti i caratteri nel PERCORSO tranne i due punti e le nuove righe.
ridiculous_fish il

Sostituendo trcon /usr/bin/trI e usando il .envfile fornito nella mia domanda, ricevo molti errori quando si avvia fish. Non penso che la gestione del PERCORSO sia corretta.
Tyilo,

Oh, giusto, il pesce lo separerà nello spazio tra virgolette. Aggiornerò il commento.
ridiculous_fish il

Yay funziona ora. Non credo che nessun altro guscio (tranne i pesci?) Consenta comunque percorsi con due punti nel PERCORSO.
Tyilo,

6

C'è (ora?) Un modo più semplice, per la risposta di @ Zanchey qui

Fish Shell: come impostare più variabili d'ambiente da un file usando export

Il digest però è:

Pesce:

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

con la differenza di essere $e l'uso dixargs


Molto più comodo e senza alcuna sintassi speciale. Grazie
Panayotis,

Non funziona con array come $ PATH
JanKanis

5

La maggior parte dei sistemi Unix utilizza PAM . Il pam_envmodulo legge un file molto simile al tuo .env.

Su Linux , pam_envlegge un file di sistema /etc/environmente un file utente ~/.pam_environment. Su OS X (e altri * BSD, che usano anche OpenPAM), sembra che pam_envlegga solo il file di sistema, quindi non puoi impostare variabili per utente in questo modo, solo per tutti gli utenti.


1

Espandendo la risposta di @ ridiculous_fish, con la seguente funzione per bash funziona anche con array che contengono spazi, come $PATHse avessi spazi nei tuoi percorsi. Tuttavia, al giorno d'oggi setenvè già definita una funzione nella libreria standard dei pesci, quindi ho cambiato il nome quishenv

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

Ora nel tuo .envfile puoi specificare i componenti dell'array come argomenti separati per il setenvcomando:

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

Per la semplice implementazione di fish @ ridiculous_fish farà:

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

1

Basta creare una funzione in $ HOME / .config / fish / Functions / env.fish con contenuto:

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

ha condiviso tutti i var creati in bash nella cartella /etc/profile.d

ad esempio: /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

fai il login su pesce o bash, fai echo $GOPATH $GOROOT $GOBIN $PATHe vedi la magia :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.