在.zshrc config中使用var multi-GOPATH设置GOBIN根目录

在.zshrc config中使用var multi-GOPATH设置GOBIN根目录,zshrc,Zshrc,我希望$GOBIN等于~/mygo/bin:~/go/bin,但它是~/mygo:~/go/bin。 我怎样才能给他们一个更好的方法?thx溶液 现在,${name/pattern/repl}参数扩展可用于将/bin附加到每个元素,或者更确切地说,将每个元素的结尾替换为/bin。为了匹配字符串的结尾,模式需要以%开头。由于任何字符串都应匹配,否则模式为空: GOPATH_ARRAY=(${(s<:>)GOPATH) 最后,需要将数组转换回冒号分隔的字符串。这可以通过j:string

我希望
$GOBIN
等于
~/mygo/bin:~/go/bin
,但它是
~/mygo:~/go/bin
。 我怎样才能给他们一个更好的方法?thx溶液 现在,
${name/pattern/repl}
参数扩展可用于将
/bin
附加到每个元素,或者更确切地说,将每个元素的结尾替换为
/bin
。为了匹配字符串的结尾,
模式
需要以
%
开头。由于任何字符串都应匹配,否则模式为空:

GOPATH_ARRAY=(${(s<:>)GOPATH)
最后,需要将数组转换回冒号分隔的字符串。这可以通过
j:string:
参数扩展标志来完成。它是
s:string:
的对应项:

GOBIN_ARRAY=(${GOPATH_ARRAY/%//bin})

替代解决方案 也可以在不使用参数扩展标志或嵌套替换的情况下执行此操作,只需将
/bin
添加到字符串的末尾,并用
/bin:
替换每个

GOBIN=${(j<:>)${${(s<:>)GOPATH}/%//bin}}
${name//pattern/repl}
扩展将每次出现的
pattern
替换为
repl
,而不仅仅是第一个类似的
${name/pattern/repl}

这也适用于
bash

就我个人而言,我觉得它有点“黑客”,主要是因为你需要写两次
/bin
,还因为它完全避开了底层语义。但这只是个人偏好,结果是一样的


注: 定义
GOPATH
时,就像您在问题中所做的那样

export GOBIN=${GOPATH//://bin:}/bin
zsh
将使用您的主目录展开每次出现的
~/
。因此,
GOPATH
的值将是
/home/kevin/mygo:/home/kevin/go
——假设用户名是“kevin”。因此,
GOBIN
也将具有扩展路径,
/home/kevin/mygo/bin:/home/kevin/go/bin
,而不是
~/mygo/bin:~/go/bin


这可以通过引用值-
GOPATH=“~/mygo:~/go”
来防止,但我建议不要这样做
~
作为主目录的同义词不是操作系统的一项功能,虽然Shell通常支持它,但其他程序(需要
GOPATH
GOBIN
的程序)可能不会这样做。

您希望得到什么结果?
GOBIN=${(j<:>)GOBIN_ARRAY}
GOBIN=${(j<:>)${${(s<:>)GOPATH}/%//bin}}
export GOBIN=${GOPATH//://bin:}/bin
export GOPATH=~/mygo:~/go