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


13

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

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

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

然后,我可以仅以bash形式提供它,并制作一个脚本,将其转换为fish格式并以fish形式提供。

我当时想可能有比这更好的解决方案,所以我想寻求一种更好的方法来在bash鱼之间共享环境变量。

注意:我正在使用OSX。


这是一个示例.env文件,我希望fish和bash都使用荒谬的fish语法处理(假设〜/ bin和〜/ bin2是空目录):

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

Answers:


17

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

setenv VAR1 val1
setenv VAR2 val2

然后setenv在各个外壳中进行适当定义。在bash中(例如.bashrc):

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

在鱼中(例如config.fish):

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

请注意,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

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

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


1
PATH鱼的修复程序是否可用于具有以下空格的路径?换行符?还有其他需要注意的事情吗?
Tyilo 2014年

[是bash和fish的内置函数,因此无需正确设置PATH即可使用[。setenv示例应与PATH中的所有字符一起使用,冒号和换行符除外。
ridiculous_fish 2014年

tr/usr/bin/tr我替换并使用.env我的问题中提供的文件,开始钓鱼时会遇到很多错误。我认为PATH处理不正确。
Tyilo 2014年

哦,对了,鱼会在引号内用空格分隔。我将更新评论。
ridiculous_fish 2014年

是的,现在可以使用。我认为其他任何外壳程序(除了fish之外)都不允许在PATH中带有冒号的路径。
蒂洛2014年


5

大多数Unix系统使用PAM。该pam_env模块读取文件的方式非常类似于您的.env

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


1

使用以下bash函数扩展@ridiculous_fish的答案,它也适用于包含空格的数组,例如,$PATH如果路径中有空格。但是,setenv现在在鱼类标准库中已经将其定义为函数,因此我在此处将名称更改为shenv

function shenv { 
        var="$1"
        shift
        export "$var=$(printf "%s\n" "$@" | paste -s -d: -)"
}
. ~/.env

现在,您.env可以在文件中将数组组件指定为setenv命令的单独参数:

shenv PATH /my/path /my/path\ with\ spaces "/my/quoted path" $PATH

对于fish @ridiculous_fish的简单实现可以做到:

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

1

只需在$ HOME / .config / fish / functions / env.fish中创建一个包含以下内容的函数:

for f in /etc/profile.d/*.sh
    sh $f
end

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

例如:/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

只需登录鱼或bash,就可以echo $GOPATH $GOROOT $GOBIN $PATH看到魔术了:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.