如何将GOPATH中第一个目录的bin子目录添加到PATH中?

如何将GOPATH中第一个目录的bin子目录添加到PATH中?

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}仅替换第一个。)

相关内容