3

Мне нравится помещать многие из моих определений переменных среды в скрипт .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'?

2 ответа2

5

Для поиска общего скрипта sh в fish , одним из вариантов является плагин bass , который может преобразовывать переменные окружения скрипта bash в fish.

Если у вас есть fisherman, вы можете установить его с помощью fisher edc/bass , а затем выполнить bass source <command> .

1

В отличие от bash, fish PATH представляет собой массив каталогов: http://fishshell.com/docs/current/index.html#variables

sed '/^PATH=/s/:/\' \'/g; s/\(.*\)="\(.*\)".*/set -x \1 \'\2\';/'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .