在 bash 和 Fish 之间共享环境变量

在 bash 和 Fish 之间共享环境变量

bash 和fish 脚本不兼容,但我想要一个文件来定义一些由bash 和fish 初始化的环境变量。

我建议的解决方案是定义一个~/.env包含环境变量列表的文件,如下所示:

PATH="$HOME/bin:$PATH"
FOO="bar"

然后我可以在 bash 中获取它并制作一个脚本,将其转换为鱼格式并在鱼中获取它。

我想可能有比这更好的解决方案,所以我要求更好的方法在 bash Fish 之间共享环境变量。

注意:我使用的是 OS X。


这是一个示例.env文件,我希望 Fish 和 bash 都能使用它来处理可笑的鱼的语法(假设 ~/bin 和 ~/bin2 是空目录):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"

答案1

bash 有特殊的语法来设置环境变量,而 Fish 使用内置语法。我建议像这样编写 .env 文件:

setenv VAR1 val1
setenv VAR2 val2

然后setenv在相应的 shell 中进行适当的定义。在 bash 中(例如 .bashrc):

function setenv() { export "$1=$2"; }
. ~/.env

在fish中(例如config.fish):

function setenv; set -gx $argv; end
source ~/.env

请注意,PATH 需要一些特殊处理,因为它在 Fish 中是一个数组,但在 bash 中是一个冒号分隔的字符串。如果你喜欢在 .env 中编写setenv PATH "$HOME/bin:$PATH",你可以像这样编写 Fish 的 setenv :

function setenv
    if [ $argv[1] = PATH ]
        # Replace colons and spaces with newlines
        set -gx PATH (echo $argv[2] | tr ': ' \n)
    else
        set -gx $argv
    end
 end

这将错误地处理 PATH 中包含空格、冒号或换行符的元素。

PATH 中的尴尬是由于将冒号分隔的字符串与真正的数组混合在一起造成的。在 Fish 中附加到 PATH 的首选方法很简单set PATH $PATH ~/bin

答案2

根据@Zanchey 的回答,(现在?)有一种更简单的方法

Fish Shell:如何使用导出从文件中设置多个环境变量

摘要是:

鱼:

echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo

重击:

echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo

区别在于$和使用xargs

答案3

大多数 Unix 系统使用聚丙烯酰胺。这pam_env模块读取文件非常类似于您的.env.

在 Linux 上pam_env读取系统文件/etc/environment和用户文件~/.pam_environment在 OS X 上(以及其他同样使用 OpenPAM 的 *BSD),它似乎pam_env只读取系统文件,因此您不能以这种方式为每个用户设置变量,只能为所有用户设置变量。

答案4

创建一个文件,用于存储所有环境变量,例如命名为~/.config/env_variables.在此文件中,添加export行,如下所示:

# This file is meant to compatible with multiple shells, including:
# bash, zsh and fish. For this reason, use this syntax:
#    export VARNAME=value

export EDITOR=vim
export LESS="-M"
export GOPATH="$HOME/.local/share/gopath/"
export PATH="$PATH:/custom/bin/"

在您的~/.config/fish/config.fish文件中,包括:

source ~/.config/env_variables

在您的~/.bashrc文件中,包括:

source ~/.config/env_variables

相关内容