Narzędzie Go-lang go działa z Bash, ale nie z Fish

5

Dla tych, którzy nie mają pojęcia, czym jest Fish: http://fishshell.com/

Podobnie, jeśli nie jesteś zaznajomiony ze środowiskiem kodowania Go i nadal chcesz spróbować rozwiązać tę małą zagadkę, oto kilka informacji: http://golang.org/doc/code.html

W każdym razie, próbuję skonfigurować dev-lang. środowisko na nowej maszynie, gdzie próbuję Fisha.

Więc mam $GOPATH Ustawić /home/<me>/workspace/go-workspace zarówno bash i fish. Oznacza to, że go narzędzie oczekuje a bin, pkg, i src pod tym katalogiem. Które tam jest.

Jednak pisanie go get będąc w katalogu z jakimś kodem (który normalnie pobierałby zależności), uzyskuje

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

Wiem, że to absolutnie fałszywe, bo mogę biegać echo $GOPATH i wyskakuje wartość, którą ustawiłem.

Potem dziwnie, jeśli uruchomię to samo polecenie bash z tym samym $GOPATH ustaw, po prostu działa.

Czy ktoś może mi powiedzieć dlaczego.

Lub, bardziej ogólnie, czy możesz mi powiedzieć, dlaczego program wykrywa zmienną środowiskową w jednej powłoce, ale nie w innej?

Logan
źródło

Odpowiedzi:

10

Czy pamiętasz, żeby zaznaczyć $GOPATH w rybach eksportowanych?

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

Nie wystarczy przetestować

echo $GOPATH

ponieważ będzie to działać niezależnie od tego, czy zmienna jest eksportowana. Sprawdź z

bash -c 'echo $GOPATH'

który wydrukuje tylko wartość GOPATH jeśli został wyeksportowany. W bashu eksportujesz zmienne takie jak ta:

export GOPATH=/home/<me>/workspace/go-workspace
rici
źródło
Wierzę -x to, czego mi brakowało. D'oh.
Logan
To działało dla mnie, dzięki, ale musiałem użyć -g modyfikator, jak w set -gx GOPATH <whatever>
agam
1

Nie wszystkie zmienne powłoki są zmiennymi środowiskowymi. W bash, musiałbyś export zmienna, która ma stać się zmienną środowiskową w procesach potomnych (jeśli ta zmienna nie była już zmienną środowiskową). To znaczy, zakładając FOO nie jest już zdefiniowane, a następnie po prostu wykonywane FOO=bar nie spowoduje zmiennej FOO być widocznym w środowisku procesu dziecięcego. Będziesz musiał to śledzić export FOOlub możesz zrobić to wszystko naraz export FOO=bar.

Zakładam, że dzieje się coś podobnego fish, gdzie musisz mieć GOPATH zdefiniowany po prostu jako zmienna powłoki, a nie jako zmienna powłoki eksportowana również do środowiska.

jjlin
źródło