Go-lang go tool 适用于 Bash 但不能适用于 Fish

Go-lang go tool 适用于 Bash 但不能适用于 Fish

对于那些不知道鱼是什么的人来说:http://fishshell.com/

同样,如果你不熟悉 Go 编码环境,但仍希望尝试解决这个小难题,这里有一些信息:http://golang.org/doc/code.html

无论如何,我正在尝试在一台新机器上建立一个 Go-lang 开发环境,在那里尝试 Fish。

因此,我在和中都$GOPATH设置为。这意味着该工具需要在其下有一个、和目录。就在那里。/home/<me>/workspace/go-workspacebashfishgobinpkgsrc

但是,go get在包含某些代码的目录中键入内容(通常会下载其依赖项)会产生

package code.google.com/p/go.crypto/openpgp: cannot download, $GOPATH not set. For more details see: go help gopath
package code.google.com/p/go.crypto/openpgp/armor: cannot download, $GOPATH not set. For more details see: go help gopath
package code.google.com/p/go.crypto/ssh: cannot download, $GOPATH not set. For more details see: go help gopath
package github.com/codegangsta/cli: cannot download, $GOPATH not set. For more details see: go help gopath
package github.com/oleiade/reflections: cannot download, $GOPATH not set. For more details see: go help gopath
package launchpad.net/goamz/aws: cannot download, $GOPATH not set. For more details see: go help gopath
package launchpad.net/goamz/s3: cannot download, $GOPATH not set. For more details see: go help gopath

我知道这绝对是错误的,因为我可以运行echo $GOPATH并且弹出我设置的值。

bash然后,奇怪的是,如果我使用相同的设置运行相同的命令$GOPATH,它就可以工作。

谁能告诉我为什么?

或者,更一般地,您能告诉我为什么一个程序能在一个 shell 中检测到环境变量,而在另一个 shell 中却不能吗?

答案1

您记得将$GOPATH鱼标记为已出口吗?

set -x GOPATH /home/<me>/workspace/go-workspace

仅仅测试是不够的

echo $GOPATH

因为无论变量是否被导出,这都会起作用。使用

bash -c 'echo $GOPATH'

GOPATH仅当已导出时才会打印其值。在 bash 中,可以像这样导出变量:

export GOPATH=/home/<me>/workspace/go-workspace

答案2

并非所有 shell 变量都是环境变量。在 中bash,您必须将export变量设置为子进程中的环境变量(如果该变量还不是环境变量)。也就是说,假设FOO尚未定义,那么简单地执行FOO=bar不会导致变量FOO在子进程的环境中可见。您必须跟进export FOO,或者您可以通过执行 一次性完成所有操作export FOO=bar

我假设在中发生了类似的事情fish,您必须将其GOPATH简单地定义为一个 shell 变量,而不是将其定义为也导出到环境中的 shell 变量。

相关内容