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
.
根据@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
小智 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
看到神奇的效果:)
归档时间: |
|
查看次数: |
8933 次 |
最近记录: |