はじめに
プログラミングを始めてから1年半、シェルはずっとzshを使っていたのですが、知り合いにオススメされてfishデビューしました。
**fishってどんなヤツなん?使ったらどんないいことあるん?**ってのは、他の記事にたくさんまとまっているので、そちらを参考にしてください!
初学者殺しの「PATHを通す」
初学者殺しでおなじみ「PATHを通す」について、fishでもbashやzshと同じように~/.config/fish/config.fishに設定を書くことで実現できるのですが、fishにはfish_user_pathsというユニバーサル変数(全てのセッションで共通の変数)を使うことでPATHを通すことができるようなので、そちらの方法でやってみます。
fish_user_pathsって何?なぜ使う?
fish shellのPATH設定 - Qiita に詳しく書かれておりますので、気になる方はご確認くださいませ。
(この後出てくるsetコマンドのオプションについてはfishパス関連設定した時の備忘録でまとめられています。)
PATHを設定してみる
ユニバーサル変数 fish_user_paths に通したいPATHをセットし、PATHを通します。(同じこと2回言ってる...?)
PATH と fish_user_pathsの中身を見てみる
まずは、中身を見てみます!
$ echo $PATH //PATHの頭に"$"をつけることで、中身を表示することができる。他の環境変数も同様。
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin
$ echo $fish_user_paths //PATHと同様に、fish_user_pathsの頭に"$"をつけることで、中身を表示することができる。
(何も出力されない)
たぶん初期設定ママだとこうなると思います。(この通りにならなくても気にせず先へ進みましょう!)
fish_user_paths に追加してみる
今回は、
「zsh時代に使っていたanyenvコマンドがfishシェルに変えたら使えなくなった(= PATHが通っていない)」
という状況を想定して考えてみます。
たとえば、PATHを通すために.zshrcにexport PATH=$HOME/.anyenv/bin:$PATH と書いていたなら、$HOME/.anyenv/binが追加対象になります。
追加するときは、setコマンドに、-Uのオプションをつけてあげます。(-Uのオプションをつけることで永続化できます)
$ set -U fish_user_paths $HOME/.anyenv/bin $fish_user_paths
$ echo $fish_user_paths
/Users/(ユーザー名)/.anyenv/bin ←(ユーザー名) にはみなさんのPCのユーザー名が入ります
fish_user_paths に /Users/(ユーザー名)/.anyenv/binが追加されたかと思います。
ちなみに、
$ echo $HOME
/Users/(ユーザー名)
なので、さっきのやつは
$ set -U fish_user_paths /Users/(ユーザー名)/.anyenv/bin $fish_user_paths
$ echo $fish_user_paths
/Users/(ユーザー名)/.anyenv/bin
でも同じ結果になります。
では、PATHの中身を確認してみましょう。
$ echo $PATH
/Users/(ユーザー名)/.anyenv/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin
初期設定で持っていたものに、今回fish_user_pathsに追加したものが追加されています。
これで、anyenvコマンドがこれまで通り使えるようになりました。
つまり、PATHにもともと入っていた
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin
に、fish_user_pathsの内容を加えたものがPATHとなります。
豆知識
| tr ' ' '\n' | nlをつけて出力すると、イイ感じに見やすくなります。
$ echo $fish_user_paths | tr ' ' '\n' | nl
1 /Users/(ユーザー名)/.anyenv/bin
$ echo $PATH | tr ' ' '\n' | nl
1 /Users/(ユーザー名)/.anyenv/bin
2 /usr/local/bin
3 /usr/bin
4 /bin
5 /usr/sbin
6 /sbin
7 /Library/Apple/usr/bin
fish_user_pathsから任意のパスを削除する
fish_user_pathsは配列なので、特定のパスを削除する場合はインデックスを指定して削除する(インデックスは0ではなく1から始まるので注意)
まずは中身を確認して
$ echo $fish_user_paths[1]
/Users/(ユーザー名)/.anyenv/bin
/Users/(ユーザー名)/.anyenv/binを消してみます。消す時は、setコマンドのオプションに-eをつけます。
$ set -e fish_user_paths[1]
$ echo $fish_user_paths
(何も出力されない)
はい、消えました。
ここでのポイントは、set -e fish_user_paths[1]で、fish_user_paths[1]の頭に$がついていないことです。$をつけるとエラーになります。
追加するときも、第一引数の環境変数(fish_user_paths)には$がついていませんね。
$ set -U fish_user_paths $HOME/.anyenv/bin $fish_user_paths
$はあくまで、内容を表示するときにつけます。
fish_user_pathsの中身を全部削除する
ちなみに、set -e fish_user_paths[1]では「fish_user_path配列の1番目の要素を消す」でしたが、set -e fish_user_pathsとインデックスを指定しない場合は全部一気に消えます。
$ echo $fish_user_paths
1 /Users/(ユーザー名)/.anyenv/envs/nodenv/shims
2 /Users/(ユーザー名)/.anyenv/bin
3 /Users/(ユーザー名)/.rbenv/shims
(たとえば、fish_user_pathsに3つ入ってる状態)
$ set -e fish_user_paths
$ echo $fish_user_paths
(何も出力されない)
まとめ
これまで「PATHを通す」時は、記事を見て言われるがままにexport PATH=$HOME/.anyenv/bin:$PATHみたく設定をコピペし、「何だか分からないけど動くようになった...」というレベルだった自分ですが、今回のやり方を通じて「環境変数PATHに値をセットすることでPATHを通す」ということがようやく少し理解できました。
「シェルに詳しいわけではないけれどfishを使い始めた(これから使いたい)!」という人のお役に立てたら幸いです。