はじめに
はじめに、環境変数とシェル変数の違いを理解しておく必要がある。
シェル変数と環境変数の違いは、有効範囲である。
シェル変数 | 環境変数 |
現在実行中のシェルのみで有効な変数 | 新たなシェルを起動しても引き継がれる |
どちらも同じコマンドを利用し、差分はオプションのみです。
確認コマンド
# シェル変数を確認したい場合
$ set
# 環境変数を確認したい場合
$ env
もしくは
$ printenv
シェル変数の設定
シェル変数は、その特性から「一時的に環境変数を利用したい、後で消えても全然いい」ときによく利用する。
アプリケーションをローカル起動するときに、ローカル環境用の環境変数が必要な場合とか。
シェル変数を利用する場合、set
コマンドを引数なしで利用する。
# 「FOO」というシェル変数に「foo」を代入する
$ set FOO foo
# setコマンド引数なしで、シェル変数一覧を表示
# grepコマンドでFOOのみに絞り込んでいる
$ set | grep FOO
FOO foo
history 'set FOO foo' 'set ' 'll' 'export | grep JAVA' 'set'…
環境変数ではないため、env
コマンドで確認しても表示されない。
$ env | grep FOO
$
また、異なるターミナルを開いてシェル変数を確認してもヒットしない。
$ set | grep FOO
history 'env | grep FOO' 'set | grep FOO' 'set FOO foo' 'set ' 'll' 'export | g'…
環境変数の設定
ローカルのPCでfishを使っていて環境変数を利用したいケースは、おおよそ以下のようなケースになる。
- パスを通したい
- プログラミング言語用の環境変数を設定したい
fishで環境変数を設定するには、以下のオプションを理解しておけば良い。
-x
:子プロセスにもexport(伝播)する、環境変数とする-U
:ユニバーサール変数にし、シェルを再起動しても残る
シェル起動時のファイル(~/.config/fish/config.fish
など)に記述する場合は毎回読み込みが発生するため、-x
オプションだけあれば良い。
set -x FOO foo
一度だけ設定して、あとはそのままにしたいのであれば、-U
オプションも同時につけておくと良い。
set -Ux FOO foo
Javaをインストールした時に設定するJAVA_HOME
などはこれで設定しておくと良い
# 17系のjavaを「JAVA_HOME」に設定する
$ set -Ux JAVA_HOME (/usr/libexec/java_home -v 17)
まとめ
- fishは環境変数、シェル変数共に
set
コマンドを利用する - 一時的に使いたい変数は以下のどちらか
- オプションなしの
set
コマンドを利用してシェル変数にする -x
オプションのset
コマンドを利用して環境変数にする
- オプションなしの
- 永続的に使いたい場合は以下のどちらか
-x
オプションを利用したコマンドをシェル起動時の読み込みファイルに記載する-Ux
オプションを一度だけ実行する
- bashとは全然指定方法が異なるため注意
おまけ
シェルにおける環境変数は、どこからでも参照できてしまうグローバル変数みたいなものなので
何かのアプリケーションをローカル起動するためだけに環境変数を設定するのはあまり好ましくない。
そういう場合は、環境変数設定用のシェルスクリプトを作成して配置しておけば環境を汚さずに済む。
env.sh
set -x FOO foo
set -x HOGE hoge
シェル変数にしてしまうと、子プロセスに引き継がれないので注意。