26
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

zshことはじめ Command not found.エラーに対処する

Last updated at Posted at 2020-07-14

Mac OSをCatalina辺りにバージョンアップしてから、コマンドライン起動時にとある表示が出てくるようになりました。

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050
user:~ user$

Macユーザであれば見覚えがあるのではないでしょうか。
ガイドラインに沿ってzshに切り替えると、設定が面倒くさかったので個人的な備忘録として残します。

ちなみに、この記事は「パスを通す」という概念がちゃんとわかっている方にとってはごく当たり前のことを書いています。

zshとは

シェルは何かしらのプログラムに対し、命令を受け付ける窓口のようなものです。
ターミナル=窓口くらいに思っていましたが、窓口にも色々種類があるようです。

有名どころだと、bash, cshなどがあります。

以前のmac OSでは、bashがデフォルトでしたが、バージョンアップでzshはmac OSのデフォルトとなりました。これは「ドラゴンボ○ルZ」のように、最後のシェル、すなわち最強のシェルです。

具体的にどのようなところが最強かというと、補完機能が使えたり、コマンドに色分けできるようになるところです。
ぶっちゃけ、私にはそこまで大きなメリットがあるとは思えません。。

zshにすると何が起きたのか

zshにしてからというもの、何かしらのパッケージをインストールしても再起動のたびにCommand not found.と表示されるようになりました。
例えば、

% npm install hoge

としてnpmのパッケージをインストールしても、
別ウィンドウで開くとエラーが出てしまいます。

% hoge -v
Command not found: hoge

whichを試してみても

% which hoge
Command not found: hoge

困り果ててしまいました。

解決策

パスを通せば問題なく使えます。

bashではホームディレクトリにある.bash_profileを編集したように、zshではホームディレクトリにある.zshrcを編集し、パスを追加します。

ホームディレクトリとは、ターミナルを立ち上げたときデフォルトで指定されているパスです。
/Users/{Macに設定した名前}

よく~で表示されますね。そのため、ホームディレクトリ直下にsrcというフォルダがあった場合、以下のように表現されます。
~/src

余談ですが、.(ドット)がつくと隠しファイルということを意味しています。
つまり、.zshrcも隠しファイルということですね。
Finder上で存在を確認したいときは、Command + Shift + .(ドット) で隠しファイル表示機能を有効にします。
逆に非表示にしたいときも同じコマンドです。

※ちゃんとしたエンジニアの方によると、このようなやり方でパスを通すのはあまり良くないそうです。よりベターな解決策が見つかった場合は、この記事を更新してお伝えしたいと思います。もしくはコメント欄に「こうすればいい!」というのを教えていただけると助かります!

.zshrcの編集は、以下のやり方が個人的にはしっくり来ました。

ホームディレクトリにある.zshrcにviでアクセス

もしホームディレクトリ直下にまだファイルができていないようであれば、viコマンド実行時に新規作成されます。

vimエディタを使ったことが無い方は、まずはvimの編集の仕方をググってみてください。
viとvimどちらでもいけます。

% vi ~/.zshrc

ターミナル内で.zshrcの中身を編集

# tabtab source for packages
# uninstall by removing these lines
[[ -f ~/.config/tabtab/__tabtab.zsh ]] && . ~/.config/tabtab/__tabtab.zsh || true

# environment paths 
# pip
export PATH="$PATH:$HOME/.local/bin"

# environment paths以下にパスを記述します。上記の例ではホームディレクトリ直下の.localファイルのバイナリ(~/.local/bin)を参照し、pipのパスを通しています。

無駄なスペースとかが入ると通らないので、気をつけてください。
※pipのインストールの仕方によって、パスは変わります。

パスを通す

以下コマンドでパスを通せば、設定は完了です。
ちなみにこのコマンドは入力しなくても、.zshrc入力後に新規でウィンドウを立ち上げれば問題なく使えます。

source ~/.zshrc

パスの記述方法について

調べてみると、パスの書き方にも色々あることがわかりました。
私が実験してみた感じでは、以下の2つの記述方法で問題なくパスが通りました。

export PATH="$PATH:{path to file}"
export PATH={path to file}:$PATH

追記:パスの順番について

「パスを通す」という概念、なんとなくしかわかっていませんでしたが、順番があるようです。

.zshrcにあるファイルだと、上のパスから順番に参照するため、後ろのパスが後回しになり通らなくなることがあります。

優先的に通したいパスほど上に書くか、以下のように書くことで優先されます。

export PATH="{path to file}:$PATH"

なぜかというと、そもそもzshrcはzshにとってのメモ帳みたいなもので、パスの情報は「$PATH」の中に格納されているからです。
export~という記述で、$PATHの中身を上書きしています。
:(セミコロン)によって上書きの順番が決まっているので、$PATHよりも手前に設定したいパスを入力することで、優先的に参照されます。

26
37
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
26
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?