web-dev-qa-db-ja.com

「rm is hashed」とはどういう意味ですか?

私は http://mywiki.wooledge.org/BashGuide/CommandsAndArguments を通過し、これに遭遇しました:

$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a Shell builtin

少し前に、このガイドでは、Bashが理解できるさまざまなタイプのコマンド(エイリアス、関数、組み込みコマンド、キーワード、実行可能ファイル)をリストしました。しかし、「ハッシュ化」についての言及はありませんでした。では、この文脈で「ハッシュ」とはどういう意味ですか?

58
user15760

これはパフォーマンスの問題です。呼び出されるたびにバイナリのパス全体を検索する代わりに、ハッシュテーブルに入れられるので、すばやく検索できます。したがって、このハッシュテーブルに既にあるバイナリはハッシュされます。すでにハッシュされているバイナリを移動した場合でも、古い場所でそれらを呼び出そうとします。

help hash、またはman bashも参照し、組み込みコマンドの下でhashを検索してください。

60
frostschutz

他の人が言及したように、ハッシュは連想配列(キー->値)であり、コマンドが実行されると、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
15
slm

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が見つからないか、無効なオプションが指定されない限り、戻りステータスはゼロです。

10
Ruban Savvy