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 a serem inicializadas pelo bash e pelo fish.
Minha solução proposta é definir um ~/.env
arquivo que contenha a lista de variáveis de ambiente como:
PATH="$HOME/bin:$PATH"
FOO="bar"
Eu poderia apenas fonte-lo no bash e criar um script que o converte para o formato de peixes e fontes que em peixes.
Eu estava pensando que poderia haver uma solução melhor do que isso, então estou pedindo uma maneira melhor de compartilhar variáveis de ambiente entre os peixes do bash.
Nota: estou usando o OS X.
Aqui está um .env
arquivo de exemplo que eu gostaria que o fish e o bash manipulassem usando a sintaxe 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"
fonte
PATH
correção para peixes funcionará com caminhos com: espaços? novas linhas? outras coisas para procurar?[
é integrado ao bash e ao fish, portanto, PATH não precisa ser configurado corretamente para uso[
. A amostra setenv deve funcionar com todos os caracteres em PATH, exceto dois pontos e novas linhas.tr
por/usr/bin/tr
I e usando o.env
arquivo fornecido na minha pergunta, recebo muitos erros ao iniciar o fish. Eu não acho que o tratamento PATH está correto.Existe (agora?) Uma maneira mais fácil, de acordo com a resposta de @ Zanchey aqui
Fish Shell: Como definir várias variáveis de ambiente de um arquivo usando a exportação
O resumo, porém, é:
Peixe:
echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo
Bater:
echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo
sendo a diferença
$
e o uso dexargs
fonte
A maioria dos sistemas Unix usa PAM . O
pam_env
módulo lê um arquivo muito parecido com o seu.env
.No Linux ,
pam_env
lê um arquivo do sistema/etc/environment
e um arquivo do usuário~/.pam_environment
. No OS X (e em outro * BSD, que também usa o OpenPAM), parece quepam_env
apenas lê o arquivo do sistema; portanto, você não pode definir variáveis por usuário dessa maneira, apenas para todos os usuários.fonte
Expandindo a resposta de @ ridiculous_fish, com a seguinte função para bash, também funciona para matrizes que contêm espaços, como
$PATH
se você tivesse espaços em seus caminhos. No entanto,setenv
já está definido como uma função na biblioteca padrão de peixes atualmente, então mudei o nome aqui parashenv
Agora, no seu
.env
arquivo, você pode especificar os componentes da matriz como argumentos separados para osetenv
comando:Para a implementação simples do fish @ ridiculous_fish, será feito:
fonte
Basta criar uma função em $ HOME / .config / fish / functions / env.fish com o conteúdo:
compartilhou todos os vars criados no bash na pasta /etc/profile.d
por exemplo: /etc/profile.d/golang.sh
basta entrar no fish ou bash, fazer
echo $GOPATH $GOROOT $GOBIN $PATH
e ver a mágica :)fonte