3/1、私がこよなく愛するfishのver 3.2.0がリリースされました。さまざまな改善や新機能の追加、補完データのアップデートなどが行われているわけですが、シレっとパスの管理を楽にするコマンド(fish_add_path
)が追加されております。
これにより、パスの管理が以前よりも若干容易になっています。そこで、改めてfishユーザが覚えておくべきパスの管理について整理しました。
ローカル変数、グローバル変数、ユニバーサル変数
fishではローカル変数、グローバル変数、ユニバーサル変数の3つのスコープを持った変数が定義できます。
なんとなく名前から想像つくかと思いますが、ローカル変数 < グローバル変数 < ユニバーサル変数の順でスコープが広いです。
変数の種類 | スコープ | 消えるタイミング |
---|---|---|
ローカル変数 | 処理のブロック(if文やfunction等) | 処理のブロックが終わると消える |
グローバル変数 | セッション | セッションが終了すると消える |
ユニバーサル変数 | 全セッション |
set -e で明示的に消さない限り消えない |
• -l or --local forces the specified shell variable to be given a scope that is local to the current block, even if a variable with the given name exists and is non-local
• -g or --global causes the specified shell variable to be given a global scope. Non-global variables disappear when the block they belong to ends
• -U or --universal causes the specified shell variable to be given a universal scope. If this option is supplied, the variable will be shared between all the current user's fish instances on the current computer, and will be preserved across restarts of the shell.
fish_user_pathsとは?
fish_user_paths
は、fishシェルで用意されている特殊なユニバーサル変数になります。
この変数に追加されたパスは追加される度に自動的に今開いているセッション及び将来開くセッション全ての $PATH
に永久的に設定が保存されます。
この変数を用いると、設定ファイルをいじることなくインタラクティブにPATHを編集することができるため、fishではこの変数を用いてパスを管理することが推奨されています。
fish_user_paths を config.fish で設定するのはNG
ユニバーサル変数であるfish_user_paths
にパスを追加すると、セッションを跨いで永続的に保持されてしまうため、config.fish
で以下のコマンドを追加してしまうと、セッションを起動するたびにパスが追加されてしまいます。起動の度に起動が遅くなることに。。
$ set -U fish_user_paths /usr/local/bin $fish_user_paths
参考:fish_user_paths を config.fish で設定するな
fish でのパスのエクスポート方法
(非推奨)設定ファイルにエクスポート命令を書き込む
bashで.bashrc
にパスのエクスポート命令を書くように、fishでも~/.config/fish/config.fish
にパスのエクスポート命令を書いて管理することができます。bashではexport
コマンドですが、fishではset -x
になります(通常はグローバル変数としてエクスポートされます)。
set -x PATH $PATH /usr/local/bin
一方で、この方法はパスの編集が非効率であることから、非推奨とされています。
(推奨)fish_add_pathコマンドを利用する
ではイケてる方法は何なのかというと、fish_add_path
コマンドを利用して、ユニバーサル変数fish_user_paths
にパスを追加します。
このコマンドは既に存在する場合は追加しないため、設定ファイルに記載しても問題ありません。
$ fish_add_path /usr/local/bin
インタラクティブなパス管理
繰り返しになりますが、fishではインタラクティブにパスを編集できるのが強みです。
追加
fish_add_path /usr/local/bin
を使用すると、$fish_user_paths
にそのパスが含まれているか否かを確認し、含まれていなかった場合(かつそのパスが存在する場合)のみパスを追加します。
$ fish_add_path /usr/local/bin
確認
現状どんなパスがエクスポートされているか確認する場合は、単純にecho
で環境変数の値を確認します。空白で区切って改行にしてやるとちょっと見やすいです。
$ echo $fish_user_paths | tr " " "\n" | nl
1 /usr/local
2 /usr/sbin
3 /usr/local/bin
4 /home/kimoton/.nodebrew/current/bin
5 /home/kimoton/.pyenv/shims
6 /home/kimoton/.pyenv/bin
7 /home/kimoton/.yarn/bin
削除
パスを削除したい場合は、-e, --erase
を使用します。インデックスで指定します。1番目を消したい場合はこんな感じ。
$ set -e fish_user_paths[1]