web-dev-qa-db-ja.com

Go-lang goツールはBashで機能しますが、Fishでは機能しません

Fishが何であるかわからない人のために: http://fishshell.com/

同様に、Goコーディング環境に精通しておらず、この小さなパズルを理解したい場合は、次の情報を参照してください。 http://golang.org/doc/code.html

とにかく、私はGo-lang開発者をセットアップしようとしています。 Fishを試してみる新しいマシンの環境。

したがって、bashfishの両方で$GOPATH/home/<me>/workspace/go-workspaceに設定します。これは、goツールがその下にbinpkg、および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を実行すると、設定した値が飛び出すので、これは絶対に間違っていることがわかります。

次に、奇妙なことに、同じ$GOPATHセットを使用してbashで同じコマンドを実行すると、正常に機能します。

誰か教えてもらえますか?

または、より一般的には、プログラムが1つのシェルで環境変数を検出し、別のシェルでは検出しない理由を教えてください。

5
Logan

魚の$GOPATHをエクスポート済みとしてマークすることを覚えていますか?

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

でテストするだけでは不十分です

echo $GOPATH

変数がエクスポートされるかどうかに関係なく機能するためです。確認する

bash -c 'echo $GOPATH'

エクスポートされている場合にのみ、GOPATHの値を出力します。 bashでは、次のように変数をエクスポートします。

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

すべてのシェル変数が環境変数であるとは限りません。 bashでは、子プロセスで環境変数になるために変数をexportする必要があります(その変数がまだ環境変数でない場合)。つまり、FOOがまだ定義されていないと仮定すると、FOO=barを実行するだけでは、子プロセスの環境で変数FOOが表示されることはありません。 export FOOでフォローアップする必要があります。または、export FOO=barを実行して一度にすべてを実行することもできます。

fishでも同様のことが起こっていると思います。ここでは、GOPATHを、環境にエクスポートされるシェル変数としてではなく、単にシェル変数として定義する必要があります。

1
jjlin