16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

fish shellユーザーのためのイケてるパス管理

Last updated at Posted at 2021-04-10

3/1、私がこよなく愛するfishver 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になります(通常はグローバル変数としてエクスポートされます)。

~/.config/fish/config.fish
set -x PATH $PATH /usr/local/bin

一方で、この方法はパスの編集が非効率であることから、非推奨とされています。

(推奨)fish_add_pathコマンドを利用する

ではイケてる方法は何なのかというと、fish_add_pathコマンドを利用して、ユニバーサル変数fish_user_pathsにパスを追加します。
このコマンドは既に存在する場合は追加しないため、設定ファイルに記載しても問題ありません。

~/.config/fish/config.fish
$ 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]
16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?