🐟

fish shell 環境変数 メモ

2022/08/15に公開

任意の環境変数を永続的に登録したい

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/binfish_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/binfish_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_pathconfig.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