私は http://mywiki.wooledge.org/BashGuide/CommandsAndArguments を通過し、これに遭遇しました:
$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a Shell builtin
少し前に、このガイドでは、Bashが理解できるさまざまなタイプのコマンド(エイリアス、関数、組み込みコマンド、キーワード、実行可能ファイル)をリストしました。しかし、「ハッシュ化」についての言及はありませんでした。では、この文脈で「ハッシュ」とはどういう意味ですか?
これはパフォーマンスの問題です。呼び出されるたびにバイナリのパス全体を検索する代わりに、ハッシュテーブルに入れられるので、すばやく検索できます。したがって、このハッシュテーブルに既にあるバイナリはハッシュされます。すでにハッシュされているバイナリを移動した場合でも、古い場所でそれらを呼び出そうとします。
help hash
、またはman bash
も参照し、組み込みコマンドの下でhash
を検索してください。
他の人が言及したように、ハッシュは連想配列(キー->値)であり、コマンドが実行されると、Bashは最初にこのハッシュを検索して、ディスク上のコマンドの場所が$PATH
を介してすでに検出され、格納されているかどうかを確認しますすばやく検索できます。
起動時にBashで検索するコマンドのリストを指定することで、ハッシュをプリロードできます。この変数はBASH_CMDS
と呼ばれます。
manページからの抜粋
BASH_CMDS
An associative array variable whose members correspond to the
internal hash table of commands as maintained by the hash builtin.
Elements added to this array appear in the hash table; unsetting
array elements cause commands to be removed from the hash table.
さらに、Bashのマニュアルページを見ると、タイトルにCOMMAND EXECUTIONというタイトルのセクションがあり、プロンプトでコマンドが入力されたときにBashが使用するステートマシンについて詳しく説明しています。
抜粋
If the name is neither a Shell function nor a builtin, and contains no
slashes, bash searches each element of the PATH for a directory con‐
taining an executable file by that name. Bash uses a hash table to
remember the full pathnames of executable files (see hash under Shell
BUILTIN COMMANDS below). A full search of the directories in PATH is
performed only if the command is not found in the hash table. If the
search is unsuccessful, the Shell searches for a defined Shell function
named command_not_found_handle. If that function exists, it is
invoked with the original command and the original command's arguments
as its arguments, and the function's exit status becomes the exit
status of the Shell. If that function is not defined, the Shell prints
an error message and returns an exit status of 127.
-l
スイッチを使用して、現在ハッシュに何があるかを確認できます。
$ hash -l
builtin hash -p /usr/bin/rm rm
builtin hash -p /usr/bin/Sudo sudo
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/ls ls
hash
は、コマンドにハッシュを提供するBash Shellビルトインです。
hash [-lr] [-p filename] [-dt] [name]
馬の口から真っ直ぐに:
help hash
プログラムの場所を記憶または表示します。
info Bash
→シェル組み込みコマンド→Bourneシェル組み込み
NAME引数として指定されたコマンドの絶対パス名を覚えておいてください。その後の呼び出しでそれらを検索する必要はありません。コマンドは、
$PATH
にリストされているディレクトリを検索することで見つかります。-p
オプションはパス検索を禁止し、NAMEの場所としてFILENAMEが使用されます。-r
オプションを使用すると、シェルは記憶されているすべての場所を忘れます。-d
オプションを使用すると、シェルは各NAMEの記憶された場所を忘れます。-t
オプションが指定されている場合、各NAMEが対応する絶対パス名が出力されます。複数のNAME引数が-t
で指定されている場合、ハッシュされたフルパス名の前にNAMEが出力されます。-l
オプションを指定すると、出力は入力として再利用できる形式で表示されます。引数を指定しない場合、または-l
のみを指定した場合は、記憶されているコマンドに関する情報が出力されます。 NAMEが見つからないか、無効なオプションが指定されない限り、戻りステータスはゼロです。