5

Для тех из вас, кто не знает, что такое Рыба: http://fishshell.com/

Точно так же, если вы не знакомы со средой кодирования Go и все еще хотите попытаться выяснить эту небольшую головоломку, вот некоторая информация: http://golang.org/doc/code.html

Во всяком случае, поэтому я пытаюсь настроить разработчика Go-lang. окружение на новой машине, где я пробую Fish.

Таким образом, я установил $GOPATH /home/<me>/workspace/go-workspace в bash и fish . Это означает, что утилита go ожидает каталог bin , pkg и src . Который там.

Однако ввод 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 , она просто работает.

Кто-нибудь может сказать мне, почему?

Или, в более общем смысле, вы можете сказать мне, почему программа обнаруживает переменную среды в одной оболочке, а не в другой?

2 ответа2

10

Вы помните, чтобы пометить $GOPATH в рыбе как экспортируемой?

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

Недостаточно проверить с

echo $GOPATH

так как это будет работать независимо от того, экспортируется ли переменная. Проверить с

bash -c 'echo $GOPATH'

который будет печатать значение GOPATH если оно было экспортировано. В bash вы экспортируете переменные следующим образом:

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

Не все переменные оболочки являются переменными среды. В bash вам нужно будет export переменную, чтобы она стала переменной окружения в дочерних процессах (если эта переменная уже не была переменной окружения). То есть, если FOO еще не определено, то простое выполнение FOO=bar не приведет к тому, что переменная FOO будет видна в среде дочернего процесса. Вы должны будете следовать за export FOO , или вы можете сделать все это сразу, выполнив export FOO=bar .

Я бы предположил, что нечто подобное происходит в fish , где GOPATH должен быть определен просто как переменная оболочки, а не как переменная оболочки, также экспортируемая в среду.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .