🐚

【コマンドの実態を追う】 brewコマンドを例に

2023/09/17に公開

概要

コマンドって具体的に何をしているんでしょうか。
shebang(シバン)を記載したり、PATHを通すことによって省略されているので分かりづらいだけで、実態としては単に実行ファイルを実行しているだけです。

コマンド作成は以下で行ったので、今回は反対にコマンドから実態である実行ファイルまでを遡って確認してみたいと思います。

https://zenn.dev/y__adler/articles/151f6c93a2a63c

結論

  • 外部コマンドはフルパスだけで実行できるように実行ファイル内にshebangが記載されている。
  • さらに、フルパスではなく末尾だけという省略形で実行できるようにPATHも通っている。

原型
$ /bin/bash /opt/homebrew/bin/brew

実行ファイルにshebangを記載することでコマンドを入力しなくても、フルパスだけで実行できるようになる
$ /opt/homebrew/bin/brew

PATHを通すことで、末尾だけでも実行できるようになる
$ brew

①brewコマンドが通っているか確認

$ brew -v
Homebrew 4.1.7
  • 通っていない人は以下の記事を参照

https://zenn.dev/y__adler/articles/c1bb35ce556132

②コマンドの実態を確認

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