🚥

Linux学習:基礎編|デフォルトで使えるLinuxコマンドの実態と`/usr/local/bin/`や`/opt/`等のディレクトリ解説

    Linux学習記録|なんとなく理解禁止シリーズ

エンジニアなら普段下記のようなコマンドを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/等で実行ファイル(バイナリファイル形式)として管理されます。ただ、手動インストールしたものによってはその管理方法は様々で、場合によっては「パスの向きを変える」「パスを通す」必要が出てきます。

基本的なコマンドの設置場所を理解した上で、困ったときは柔軟に対処すると良いでしょう。

Linux学習:基礎編|パス(PATH)を通すとは何ぞや!エンジニアなら避けては通れぬ...