Existe uma maneira de “fonte” de um script sh da casca de peixe?

3

Eu gosto de colocar muitas das minhas definições de variáveis de ambiente no script .profile . Se eu estiver usando um shell interativo compatível com POSIX como o bash, posso usar o comando source para exportar novamente as variáveis de ambiente de .profile quando for atualizado, sem precisar abrir uma nova janela de terminal. Existe uma maneira de fazer o mesmo quando estou usando fish , que usa uma sintaxe diferente para exportar variáveis? Posso dizer ao fish para executar um subprocesso sh e reexportar as variáveis que ele define?

Quando tento fazer o óbvio sh .profile , as variáveis de ambiente aparentemente só são definidas na criança sh process e não são atualizadas no processo pai fish .

edit: o código do shell que define minhas variáveis é este

CAML_LD_LIBRARY_PATH="/home/hugo/.opam/4.01.0/lib/stublibs"; export CAML_LD_LIBRARY_PATH;
PERL5LIB="/home/hugo/.opam/4.01.0/lib/perl5:"; export PERL5LIB;
OCAML_TOPLEVEL_PATH="/home/hugo/.opam/4.01.0/lib/toplevel"; export OCAML_TOPLEVEL_PATH;
MANPATH=":/home/hugo/.opam/4.01.0/man"; export MANPATH;
PATH="/home/hugo/.opam/4.01.0/bin:/home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"; export PATH;

Infelizmente, esse código é gerado automaticamente por outro programa, portanto, a conversão para o Fish também deve ser feita usando um processo automatizado. Eu tentei usar o seguinte script sed

sed 's/\(.*\)="\(.*\)".*/set -x  \'\';/'

que produz o seguinte código de Peixe

set -x CAML_LD_LIBRARY_PATH '/home/hugo/.opam/4.01.0/lib/stublibs';
set -x PERL5LIB '/home/hugo/.opam/4.01.0/lib/perl5:';
set -x OCAML_TOPLEVEL_PATH '/home/hugo/.opam/4.01.0/lib/toplevel';
set -x MANPATH ':/home/hugo/.opam/4.01.0/man';
set -x PATH '/home/hugo/.opam/4.01.0/bin:/home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games';

Qual eu posso executar usando eval e () substitution

eval (my-sed-script)

No entanto, o peixe está reclamando quando tento definir o PATH. Eu acho que pode ser PATH de invólucro especial e esperar uma matriz em vez de uma única string.

set: Warning: path component /home/hugo/.opam/4.01.0/bin:/home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games may not be valid in PATH.
set: No such file or directory
set: Did you mean 'set PATH $PATH /home/hugo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games'?
    
por hugomg 14.10.2014 / 23:31

2 respostas

1

Diferentemente do bash, o PATH de peixe é uma matriz de diretórios: link

sed '/^PATH=/s/:/\' \'/g; s/\(.*\)="\(.*\)".*/set -x  \'\';/'
    
por 15.10.2014 / 01:35
5

Para obter um script geral de sh em fish , uma opção é o plug-in bass , que pode gerar uma programação variáveis de ambiente do script em peixes.

Se você tiver pescador , você pode instalar com fisher edc/bass , então faça bass source <command> .

    
por 31.07.2017 / 01:09