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 的回答,(现在?)有一种更简单的方法
摘要是:
鱼:
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
答案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