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

Tyi*_*ilo 17 bash environment-variables fish

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

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

PATH="$HOME/bin:$PATH"
FOO="bar"
Run Code Online (Sandbox Code Playgroud)

然后我可以在 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"
Run Code Online (Sandbox Code Playgroud)

rid*_*ish 19

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

setenv VAR1 val1
setenv VAR2 val2
Run Code Online (Sandbox Code Playgroud)

然后setenv在各自的外壳中适当地定义。在 bash 中(例如 .bashrc):

function setenv() { export "$1=$2"; }
. ~/.env
Run Code Online (Sandbox Code Playgroud)

在鱼中(例如 config.fish):

function setenv; set -gx $argv; end
source ~/.env
Run Code Online (Sandbox Code Playgroud)

请注意, PATH 将需要一些特殊处理,因为它在 fish 中是一个数组,但在 bash 中是一个冒号分隔的字符串。如果你更喜欢setenv PATH "$HOME/bin:$PATH"用 .env编写,你可以像这样编写 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
Run Code Online (Sandbox Code Playgroud)

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

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


Chr*_*ver 9

根据@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


Gil*_*il' 7

大多数 Unix 系统使用PAM。该pam_env模块读取一个非常像你的.env.

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


小智 5

只需在 $HOME/.config/fish/functions/env.fish 中创建一个函数,内容如下:

for f in /etc/profile.d/*.sh
    sh $f
end
Run Code Online (Sandbox Code Playgroud)

共享在文件夹 /etc/profile.d 中的 bash 中创建的所有变量

例如:/etc/profile.d/golang.sh

#!/bin/sh
export GOPATH=$HOME/gopath
export GOROOT=$HOME/go
export GOBIN=$HOME/gobin

export PATH=$PATH:$GOROOT/bin:$GOBIN
Run Code Online (Sandbox Code Playgroud)

只需登录 Fish 或 bash,就可以echo $GOPATH $GOROOT $GOBIN $PATH看到神奇的效果:)