echo $GOPATH
将打印:
/mnt/star/program/go/package:/mnt/star/git_repository/workspace/go_workplace
有2个目录,我想将第一个目录的子目录附加bin/
到$PATH
.
如果我写$PATH=$PATH:$GOPATH/bin
,那么实际上它会将 2 个目录附加到$PATH
:
/mnt/star/program/go/package
这仅包含目录,它应该是/mnt/star/program/go/package/bin
./mnt/star/git_repository/workspace/go_workplace/bin
这实际上不应该添加到$PATH
.
顺便说一句,有些情况下$GOPATH
只包含一个目录,因此只需附加$GOPATH/bin
即可。
我正在寻找适合这两种情况的解决方案。那么,如何将其写入 bash 配置文件中呢?
答案1
您可以使用:
PATH="$PATH:${GOPATH%%:*}/bin"
或者
PATH="$PATH:${GOPATH%:*}/bin"
两者都可以工作,因为最多可以有一个:
。
它将删除之后的部分:
。因此,在第一种情况下,它将删除第二个目录,在第二种情况下,不会有类似 的模式:*
,因此目录名称不会发生变化。
答案2
PATH="$PATH:${GOPATH%%:*}/bin"
星号是一个全局变量,而不是正则表达式。两个百分号意味着从后面去掉它能匹配的最大值,所以即使有三个或更多目录,你也只会得到第一个。
如果没有要删除的内容,则它不会删除任何内容,因此如果只有一条路径,您将获得唯一的路径。
答案3
这是使用数组的替代答案;不幸的是,这需要两个步骤来分配答案,但我还是提到它,因为它比其他答案更通用并且可能更通用:
IFS=: read -ra arr_gopath <<< "$GOPATH"
PATH="$PATH:${arr_gopath[0]/%//bin}"
这种方法的优点是您可以轻松指定 的任何组件GOPATH
,而不仅仅是第一个组件。或者,附加全部元素,后跟/bin
、 到PATH
:
PATH="$PATH:$(IFS=:; echo "${arr_gopath[*]/%//bin}")"
在这两种情况(拆分、合并)中,我们将内部字段分隔符 ( IFS
) 设置为冒号字符:
。替换${var/%//bin}
附加/bin
到所选变量的末尾。
也就是说,如果您想附加全部 GOPATH
组件,后缀为/bin
,那么PATH
下面的内容会更简单,并且不需要数组。但是,它确实要求GOPATH
不为空:
PATH="$PATH:${GOPATH//://bin}/bin"
(${var//pattern/subst}
替换全部pattern
上面使用的with subst
、 while的出现${var/pattern/subst}
仅替换第一个。)