Мне нравится помещать многие из моих определений переменных среды в скрипт .profile
. Если я использую POSIX-совместимую интерактивную оболочку, такую как bash, я могу использовать команду source для повторного экспорта переменных среды из .profile
при его обновлении без необходимости открывать новое окно терминала. Есть ли способ сделать то же самое, когда я использую fish
, которая использует другой синтаксис для экспорта переменных? Могу ли я сказать fish запустить подпроцесс sh
повторно экспортировать все переменные, которые он определяет?
Когда я пытаюсь сделать очевидный sh .profile
переменные среды, очевидно, определяются только в дочернем процессе sh
и не обновляются в родительском процессе fish
.
редактировать: это код оболочки, определяющий мои переменные
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;
К сожалению, этот код автоматически генерируется другой программой, поэтому преобразование в Fish также должно выполняться автоматически. Я попытался использовать следующий скрипт
sed 's/\(.*\)="\(.*\)".*/set -x \1 \'\2\';/'
который выводит следующий код Fish
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';
Который я могу запустить с помощью eval и ()
замены
eval (my-sed-script)
Тем не менее, рыба жалуется, когда я пытаюсь установить PATH. Я думаю, что это может быть особый случай PATH и ожидание массива вместо одной строки.
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'?