🐚
【コマンドの実態を追う】 brewコマンドを例に
概要
コマンドって具体的に何をしているんでしょうか。
shebang(シバン)を記載したり、PATHを通すことによって省略されているので分かりづらいだけで、実態としては単に実行ファイルを実行しているだけです。
コマンド作成は以下で行ったので、今回は反対にコマンドから実態である実行ファイルまでを遡って確認してみたいと思います。
結論
- 外部コマンドはフルパスだけで実行できるように実行ファイル内にshebangが記載されている。
- さらに、フルパスではなく末尾だけという省略形で実行できるようにPATHも通っている。
原型
$ /bin/bash /opt/homebrew/bin/brew
↓
実行ファイルにshebangを記載することでコマンドを入力しなくても、フルパスだけで実行できるようになる
$ /opt/homebrew/bin/brew
↓
PATHを通すことで、末尾だけでも実行できるようになる
$ brew
①brewコマンドが通っているか確認
$ brew -v
Homebrew 4.1.7
- 通っていない人は以下の記事を参照
②コマンドの実態を確認
whichを用いることでコマンドのフルパスを調べることができます。
普段コマンドとして入力しているのは、コマンドの実態である実行ファイルのフルパスの末尾です。
なのでwhichを使ってフルパスを調べるとコマンドの実態である実行ファイルのありかがわかります。
$ which brew
/opt/homebrew/bin/brew
フルパスがわかったので、ありかがわかりました。
/opt/homebrew/bin/brew と brewは同じです。
毎回長いフルパスを記入せずに済むように、PATHを通すことで末尾以外を省略しても同じ実行結果が得られるようになっています。
試してみると以下のような結果が得られます。
$ /opt/homebrew/bin/brew -v
Homebrew 4.1.7
$ brew -v
Homebrew 4.1.7
③実行ファイル確認
実行ファイルのPATHがわかったので中身を見てみます。
$ cat /opt/homebrew/bin/brew
#!/bin/bash
set -u
続く、、
#!から始まるのがshebangで、#!があった場合にはその後ろに書かれたコマンドを実行します。
つまり#!/bin/bashはこの実行ファイルを/bin/bashで実行するということです。
$ /bin/bash /opt/homebrew/bin/brew -v
Homebrew 4.1.7
bashもPATHが通っているのでコマンドで実行できます
$ bash /opt/homebrew/bin/brew -v
Homebrew 4.1.7
Discussion