たとえば、export export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
またはGOPATH=~/workspace/me/go
を実行すると、どのファイルに追加されますか?
変数をexport
すると、どこのファイルにも追加されません。
単に変数を割り当てるのではなく、export
の効果は、シェルのすべての子プロセスの環境に変数を渡すことです。それ以外は何もしません。シェルの構成ファイルは変更されません。シェルとそのすべての子プロセスが終了すると、エクスポートされた変数はなくなります!最初のシェルの子ではない新しいシェルを開くと、そのシェルは変数を記憶しません。
実際、PATHは既に環境変数であるため、export
PATHを使用する必要はありません。既にエクスポートされています。子プロセスの環境に自動的に渡され、変更すると、子プロセスもその変更を継承します。
これは、環境変数を出力するコマンドであるprintenv
を使用して確認できます。
$ foo=bar; echo $foo # set a variable
bar # the Shell knows it
$ printenv foo # but it's not in the environment...
$ export foo; printenv foo # export the variable and check again
bar # there it is!
$ foo=new; printenv foo # change the variable
new # the change is inherited
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ PATH=/usr/bin; printenv PATH # printenv is in /usr/bin so keep that!
/usr/bin # the change was inherited
(このシェルから開始する新しいシェルは、私が台無しにしたPATH変数を継承するため、PATHを取り戻すには、シェルを終了する必要があります。source /etc/environment
...)
変数を永続的に設定する場合は、シェルの構成ファイルのいずれかに自分で追加する必要があります。
私の知る限り、PATHがUbuntuの/etc/environment
にデフォルトで設定されている唯一の変数です。 /etc/environment
を編集してPATHを設定するnotをお勧めします。または、そうする場合は、元のファイルのバックアップを作成するよう注意してください。元のPATHを復元する方法(どこかに書き留めているか、素晴らしい記憶がない限り)。また、コンテンツに対して展開が実行されないことに注意してください。したがって、$PATH
、$GOPATH
、または~
ではなく、フルパスを使用する必要があります。そのようなものを書く場合、それらは文字通りPATHにあり、PATHが文字通り$PATH:~/workspace/me/go
である場合、フルパスを使用しないとコマンド(シェルに組み込まれているものを除く)を実行できません。
また、.bashrc
にPATHを設定することはお勧めしません。すべてのインタラクティブなBashシェルが.bashrc
を読み取り、シェルから新しいシェルを開始することなどは非常に一般的だからです...
PATH="$PATH:$HOME/foo"
.bashrc
で、/home/user/foo
がPATHに複数回追加されることがわかります。シェルがシェルを開始するたびに、PATHが再び拡張されます。これにより、特に多くのパスを追加した場合、最終的に速度が低下する可能性があります。また、インタラクティブBashシェルのみが~/.bashrc
を読み取るため、Bash以外のシェルを使用する場合、またはスクリプトを実行する場合、インタラクティブBashシェルの子プロセスではないため、この変数はありません。
代わりに、~/.profile
に行を追加してPATHを拡張することをお勧めします。このファイルはログインシェルによってのみ読み取られます。通常、セッションにログインしたときに1回だけ読み取られるため、PATHは1回だけ追加され、すべてのシェルは、インタラクティブなBashシェルだけでなく、そこに設定された環境変数を継承します。通常、このファイルに環境変数を追加します。したがって、テキストエディタで~/.profile
を開き、次のような行を追加できます。
GOPATH="$HOME/workspace/me/go"
PATH="$PATH:$GOPATH/bin"
いずれかのディレクトリに特殊文字が含まれている場合は、示されているとおりにパスを引用することをお勧めします(名前に特殊文字を含まないディレクトリを作成することもお勧めしますが、二重引用符(~
)はチルダの展開を抑制するため、/home/user
のショートカットとして"
を使用することはできませんが、パラメーター展開が実行され、$HOME
が$HOME
になるため、代わりに/home/user
を使用できます。
編集後、ファイルを保存して終了し、ログアウトして再度ログインするか、source ~/.profile
を実行すると、PATHには常に/home/user/workspace/me/go
が含まれます。
シェルのカスタマイズは通常、$HOME/.bashrc
に編集されます。これは、起動する各シェルによってsourced
です。 man bash
を読んでください。
ところで、あなたはGOPATH
定義を持っている必要があります
GOPATH=~/workspace/me/go
GOPATH
を使用する前に
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
また、GOROOT
の定義はどこですか?