🐟
fish shell 環境変数 メモ
任意の環境変数を永続的に登録したい
set -Ux NAME_OF_ENVIRONMENT_VARIABLE value_of_environment_variable
解説
-
set
は、変数を登録するfish shell独自のコマンド。
例: シェルスクリプトを書く際などで、set -l hoge_name hoge_value
とすれば、ローカル変数hoge_name
を宣言できる。 -
-U
は、宣言した変数を永続化するオプション。
例:set -x NAME_OF_ENV VALUE_OF_ENV
と-U
つけないで宣言すると、NAME_OF_ENV
はシェルを再起動した際に消える。 -
-x
は、環境変数を宣言するオプション。
PATHに追加したい
fish_add_path PATH_TO_ADD_PATH_ENV
解説
fish_add_path
は、引数をPATHに永続的に追加してくれるfish shell独自の便利コマンド。
一度ターミナル上で、
fish_add_path /usr/local/bin
とすれば、シェルを再起動したのちも、/usr/local/bin
がPATHに追加された状態を維持する。
内部的には、/usr/local/bin
をfish_user_paths
に重複しないよう良い感じに追加してくれてる。
直接`fish_user_paths`に追加するのはやめよう
結論
config.fish
でPATHを追加したい場合は、fish_add_path
コマンドを使おう。
理由
コード1
set -U fish_user_paths /usr/local/bin $fish_user_paths
コード2
fish_add_path /usr/local/bin
コード1とコード2は、同じくPATHに/usr/local/bin
を追加するコードであり、同様の結果を得られる。しかし、コード1をconfig.fish
などに書くと、不具合が発生する。なぜなら、コード1では、config.fish
が読み込まれるたびに、/usr/local/bin
がfish_user_paths
にどんどん追加されていく。よって、fish_user_paths
は再起動時にリセットされない変数なので、下記コードのようにshellの起動のたびに長くなってしまうのだ。
$ echo $fish_user_paths
>>> /usr/local/bin /usr/local/bin /usr/local/bin /usr/local/bin /usr/local/bin /usr/local/bin /usr/local/bin ...
しかし、fish_add_path
では、重複した内容が既にfish_user_paths
に存在する場合は、その内容はもう追加されないようになってる。したがって、fish_add_path
はconfig.fish
内でも正常に使える。
OKなconfig.fish
fish_add_path /usr/local/bin
NGなconfig.fish
set -U fish_user_paths /usr/local/bin $fish_user_paths
# fish_user_pathsが起動の度に長くなる
よって、わざわざfish_user_paths
に直接追加するメリットはない。
Discussion