はじめに
プログラミングを始めてから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を使い始めた(これから使いたい)!」という人のお役に立てたら幸いです。