有没有办法从 fish shell 中“获取” sh 脚本?

有没有办法从 fish shell 中“获取” sh 脚本?

我喜欢将许多环境变量定义放在.profile脚本中。如果我使用的是兼容 POSIX 的交互式 shell(如 bash),则可以使用 source 命令在.profile更新时重新导出环境变量,而无需打开新的终端窗口。当我使用 时,有没有办法执行相同的操作fish,它使用不同的语法来导出变量?我可以告诉 fish 运行一个sh子进程并重新导出它定义的任何变量吗?

当我尝试做显而易见的事情时,sh .profile环境变量显然只在子进程中定义sh,而不会在父fish进程中更新。


编辑:定义我的变量的shell代码是这个

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 脚本

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 时,fish 发出了抱怨。我认为它可能是特殊情况的 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'?

答案1

对于采购一般sh脚本fish,一个选项是低音插件,它可以将 bash 脚本的环境变量导入到 fish 中。

如果你有渔夫,您可以使用 安装它fisher install edc/bass,然后运行bass source <command>

答案2

与 bash 不同,fish PATH 是一个目录数组: http://fishshell.com/docs/current/index.html#variables

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

相关内容