経験したこと
「Ubuntuにnvmコマンドを入れたい」となり、公式ドキュメントの手順でインストールをした。
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
その後、 which コマンドでパスを確認してから、実行しようとしたのだけど、「whichコマンドでは見つからないが、実行できる」結果となり、少し混乱した。
$ which nvm $ $ nvm -v 0.40.3
Geminiに聞いてみた
Geminiに聞いてみたところ、要旨として以下のような回答だった。また、今回の nvm は「シェル関数」に該当するようだった。
そして、
whichコマンドは、基本的に環境変数 PATH に設定されたディレクトリ群の中から、指定された名前の実行可能ファイルを探し出し、そのフルパスを表示するものです。エイリアス、シェル関数、シェルビルトインコマンドは、この検索メカニズムの対象外となるため、whichでは見つからない(または異なる表示になる)のです。
とのこと。
※追記: bashで which cd すると、 cd: shell built-in command って出たのでこの解説があっているかは怪しい。
A. LinuxのShellで実行可能なCLIコマンドにはいくつかの種類がある
- 外部ファイル
- Shellの組み込みコマンド
- alias
- シェル関数
B. 実行しているコマンドがどれに該当するかは type コマンドで確認が可能
1. 外部ファイルの場合
ファイルパスが表示される。
$ type lsof lsof is /usr/bin/lsof
2.Shellの組み込みコマンドの場合
shell builtin と表示される。
$ type cd cd is a shell builtin
3.aliasの場合
xxx is aliased of ... と表示される。
$ type ll ll is aliased to `ls -alF'
4.シェル関数
# シェル関数の宣言
$ myfunc() { echo "Hello from function"; }
# typeを実行するとコードが表示される
$ type myfunc
myfunc is a function
myfunc ()
{
echo "Hello from function"
}