For

2023.9.16

terminalでどのようにコマンドが実行できるのかグローバルにインストールされたyarnで確認する

概要

何気なく yarn <command> を実行している人向けの初歩的な記事です。
そもそもterminalで打ったコマンドがどのように実行されるのかを確認します。

検証

コマンドがなぜ実行できるか

例えば、どこのディレクトリであっても yarn --version を実行すると私の環境(mac)ではyarnのversionが確認できます。

bash_____terminal_____$ yarn --version
1.22.19


これはnpmを通じてyarnがグローバルにインストールされているからです。
npmの話は別記事にするとして、今回はyarnがどうやって実行されているか確認します。

terminalコマンドは $PATH に定義されたpathのリストにそのコマンドが存在するか順番に探索され、存在すれば実行されます。
つまり、今回は $PATH にyarnが実行できるpathがあったということになります。

$PATHを確認する

echoで確認してみます。

bash_____terminal_____$ echo $PATH
~~省略~~/Users/kobayashi/Library/Caches/fnm_multishells/<xxxx>/bin:~~省略~~


結果は上記の部分以外省略していますが、私はNodeをfnmというツールを通じてインストール&バージョン管理しているので、それっぽいディレクトリはこちらもpathとなっていました。
このpathに何があるか確認します。
上記のpathに移動し ls -la を実行します。

bash_____terminal_____$ ls -la
-rwxr-xr-x   1 kobayashi  staff  93138384  6 20 21:59 node
lrwxr-xr-x   1 kobayashi  staff        38  7 24 14:22 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxr-xr-x   1 kobayashi  staff        38  7 24 14:22 npx -> ../lib/node_modules/npm/bin/npx-cli.js
lrwxr-xr-x   1 kobayashi  staff        36  8 14 08:58 yarn -> ../lib/node_modules/yarn/bin/yarn.js
lrwxr-xr-x   1 kobayashi  staff        36  8 14 08:58 yarnpkg -> ../lib/node_modules/yarn/bin/yarn.js


ファイルモードを確認すると npm npx yarn などのシンボリックリンクが作成されていることがわかります。
シンボリックリンクはショートカットのようなもので、そのディレクトリにそのファイルがあるかのように振る舞います。

yarnの在り処

上記で確認できたyarnのシンボリックリンク先を見てみます。

bash_____terminal_____ls -la
-rwxr-xr-x  1 kobayashi  staff  1025  8 14 08:58 yarn
-rwxr-xr-x  1 kobayashi  staff    34  8 14 08:58 yarn.cmd
-rwxr-xr-x  1 kobayashi  staff  1015  8 14 08:58 yarn.js
-rwxr-xr-x  1 kobayashi  staff    42  8 14 08:58 yarnpkg
-rwxr-xr-x  1 kobayashi  staff    30  8 14 08:58 yarnpkg.cmd


先ほどのシンボリックリンクで確認できたように yarn.js がありました。
ということで yarn --version を実行したときには上記にある yarn.js が実行されているということがわかりました。

まとめ

まずはterminalでコマンドを実行したときにどういう流れで実行できているのかが理解できたところで、次はnpmとnpxについて見ていきたいと思います。