エンジニアなら普段下記のようなコマンドをCLIでよく使っているかと思います。
$ cd ~/Documents/hoge/
# ディレクトリの移動
$ ls
# 現在のディレクトリの中身を表示
$ find ~/Downloads -name "*tmok*.psd"
# 特定のフォルダ内のファイル検索
$ npm install -g yarn
# npmパッケージマネージャーを使ったインストール
$ brew install node
# macOSやLinuxのソフトウェアをインストールするためのコマンド
などなど他にも沢山ありますが、普段何気なく使っているこれらのコマンドが、どこにどんな風に管理されているか...その実態を調べていきたいと思います。
コマンドが格納される場所は大きく分けて4種類
① /bin/
システムを動作のための基本的でかつ非常時にも利用できるコマンド。
chmod / rm / mv / mkdir / など
② /usr/bin/
システム管理者や一般ユーザーが使用するコマンドやユーティリティ。/bin/
よりも少し広範なコマンドセット
cd / grep / find / sed / など
③ /usr/local/bin/
システム管理以外でインストールした
ソフトウェアやユーザーが手動でインストールした実行バイナリファイルが置かれる。
npm / node / など様々
④ /opt/**
自己完結型の様々なアプリが配置されるディレクトリ。/bin
等のバイナリファイルだけでなく様々な種類のファイルが格納される。
homebrew / など様々
Linux豆知識 214「/bin」「/usr/bin」「/usr/local/bin」ディレクトリの使い分け|Linuc
もちろん他にもありますが、普段よく使っているコマンドの格納場所は大体上記のラインナップです。それぞれ役割や格納場所が異なっていています。
/bin/
ディレクトリって何だい
bin
とはbinary
(バイナリの略)で、コマンドの実行ファイル等が設置される場所を示す場合が多いです。試しに/bin/mv
の実行ファイルを見てみると...
$ cat /bin/mv
# ����@��`*�__stubs__TEXT^8^�__stub_helper__TEXTt9�t9�__const__TEXTP;:P;__cstring__TEXT�;�;__unwind_info__TEXT�?T�?�__DATA@@@@__nl_symbol_ptr__DATA@.__got__DAT@@/__la_symbol_ptr__DATA(@p(@3__bss__DATA�A H__LINKEDIT����R"��HP��H� x�4@�
...うん、ちょっと見るのは辞めておきましょう。バイナリファイルとは中身がバイナリデータなファイルのことで、人間が見るものではなく、コンピュータが解釈できる形式のファイルになります。
バイナリファイル(英:binary file)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
人間がCLIでcd hoge
と打ったとき、コンピュータが何をすれば良いか、コンピュータにとって分かりやすい形式で実行ファイルとして設置されるのが/bin
系のディレクトリ。といった解釈で良いかと思います。
「パスを通す」という文脈で理解を深める
実務で躓きがちなのは、「パスを通す」という作業かと思います。ちなみに、詳しい解説と実際にパスを通す流れは下記の記事で説明しています!
Linux学習:基礎編|パス(PATH)を通すとは何ぞや!エンジニアなら避けては通れぬ...
実務でもよくある文脈としては...
nodeのバージョンがインストールした通りのバージョンにならない?一度
which node
でパスの向きを調べて見ましょう。もしかして他の/bin
ディレクトリを見ているかもしれないから、パスを通し直して見ましょう。
みたいな会話でしょう。もう少しそのシチュエーションを細かく定義してみます。
nodeのパスの向きを調整するシチュエーション
【状況】
- nodeを複数箇所でインストールしている
- ひとつは
brew install node
で/usr/local/bin/
に格納されている - もうひとつは
nodenv
というツールを使って~/.nodenv/shims/
に格納されている which node
を叩くと/usr/local/bin/
が返ってくる- nodeのバージョン管理はnodenvでしたい
まず、brew install node
をすると、homebrewがユーザーが手動でインストールしたパッケージとして/usr/local/bin/
にnode実行ファイルを設置してくれます。/usr/local/bin/
の役割通りの動きですね。
そして、nodenvの方は独自の管理方法をとっていて、nodenvでnodeのバージョン管理をしたいなら、パスは~/.nodenv/shims/
に向いていないといけません。
このように、/usr/local/bin/
でも/opt/**
配下でもなく、独自に実行ファイルを管理しているパターンもあって、大概こういう時に「パスの向きが違う問題」は起きます。
解決方法
下記のようにしてやれば、そのシェルのコンテキストだけは解決するかと思います。
export PATH="$HOME/.nodenv/shims/:$PATH"
export
で環境変数PATH
を上書きしていて、コマンド探索の時に先頭から順に見ていくので、上記で一旦はnodenv
の方を向きます。
ただ、正しいセットアップ方法はnodenv|GitHubドキュメントを参照しましょう。ちゃんと解決するためには~/.zshrc
や~/.bash_profile
等に下記の記述があった方が良いです。
eval "$(nodenv init -)"
nodenvはinit
という実行で、パスの向きを設定したり、他にセットアップに必要な作業を自動でやってくれます。多分このコマンドを実行していないせいで、環境変数PATH
にnodenvのパスが通っていないのだと思います。
まとめ
Linuxのコマンドは基本的には、/bin/
, /usr/bin/
, /usr/local/bin/
等で実行ファイル(バイナリファイル形式)として管理されます。ただ、手動インストールしたものによってはその管理方法は様々で、場合によっては「パスの向きを変える」「パスを通す」必要が出てきます。
基本的なコマンドの設置場所を理解した上で、困ったときは柔軟に対処すると良いでしょう。