Compartilhar variáveis de ambiente entre festança e peixe

10

Os scripts bash e fish não são compatíveis, mas eu gostaria de ter um arquivo que defina algumas variáveis de ambiente para serem inicializadas pelo bash e pelo fish.

Minha solução proposta é definir um arquivo ~/.env que conteria a lista de variáveis de ambiente, como:

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

Eu poderia então fazer uma fonte no bash e criar um script que o converte em formato de peixe e fontes que em peixes.

Eu estava pensando que pode haver uma solução melhor do que isso, então estou pedindo uma maneira melhor de compartilhar variáveis de ambiente entre peixes bash.

Nota: estou usando o OS X.

Aqui está um exemplo do arquivo .env que gostaria que tanto o fish quanto o bash manipulassem usando a sintaxe do ridiculous-fish (suponha que ~ / bin e ~ / bin2 sejam diretórios vazios):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"
    
por Tyilo 28.12.2014 / 21:27

3 respostas

15
O

bash tem uma sintaxe especial para definir variáveis de ambiente, enquanto o peixe usa um builtin. Eu sugiro escrever seu arquivo .env assim:

setenv VAR1 val1
setenv VAR2 val2

e, em seguida, definindo setenv apropriadamente nos respectivos shells. No bash (por exemplo, .bashrc):

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

Em peixes (por exemplo, config.fish):

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

Observe que o PATH exigirá algum tratamento especial, já que é uma matriz em fish, mas uma string delimitada por dois-pontos no bash. Se você preferir escrever setenv PATH "$HOME/bin:$PATH" em .env, você pode escrever o setenv do fish assim:

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

Isso irá manipular incorretamente os elementos no PATH que contêm espaços, pontos-e-vírgulas ou novas linhas.

O constrangimento no PATH é devido a misturar strings delimitadas por dois pontos com arrays verdadeiros. A maneira preferida de anexar ao PATH em peixes é simplesmente set PATH $PATH ~/bin .

    
por 28.12.2014 / 22:08
6

Existe (agora?) uma maneira mais fácil, conforme a resposta de @ Zanchey aqui

Fish Shell: Como definir várias variáveis de ambiente a partir de um arquivo usando exportação

O resumo é:

Peixe:

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

com a diferença sendo $ e o uso de xargs

    
por 23.09.2015 / 06:38
4

A maioria dos sistemas Unix usa o PAM . O % módulopam_env lê muito um arquivo como seu .env .

No Linux , pam_env lê um arquivo de sistema /etc/environment e um arquivo de usuário ~/.pam_environment . No OS X (e outros * BSD, que da mesma forma, use o OpenPAM), parece que pam_env apenas lê o arquivo do sistema, então você não pode definir variáveis por usuário dessa maneira, apenas para todos os usuários.

    
por 30.12.2014 / 01:01