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


58

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

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

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

回答:


59

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

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


15

他の人が言及したように、ハッシュはBashが保持する連想配列(キー->値)であるため、コマンドが実行されると、Bashは最初にこのハッシュを検索して、ディスク上のコマンドの場所がを介して既に検出$PATHされ、そこに保存されているかどうかを確認しますより速く検索するため。

Bashが呼び出されたときに検索するコマンドのリストを指定することにより、ハッシュをプリロードできます。この変数はと呼ばれBASH_CMDSます。

マニュアルページからの抜粋

   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のマニュアルページを見ると、コマンド実行時にコマンドが入力されたときに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

とても助かります。スクリプトの作成中に、このハッシュが邪魔になることがわかりました。これを無効化またはクリアする方法はありますか?
qodeninja

10

hash コマンドのハッシュを提供する組み込みのBashシェルです。

hash [-lr] [-p filename] [-dt] [name]

馬の口から真っ直ぐに:

help hash

プログラムの場所を記憶または表示します。

info Bash →シェル組み込みコマンド→Bourne Shell Builtins

NAME引数として指定されたコマンドの完全パス名を覚えておいてください。したがって、以降の呼び出しで検索する必要はありません。コマンドは、にリストされているディレクトリを検索することで見つかります$PATH。この-pオプションはパス検索を禁止し、FILENAMEがNAMEの場所として使用されます。この-rオプションにより、シェルは記憶されているすべての場所を忘れます。この-dオプションにより、シェルは各NAMEの記憶場所を忘れます。場合-tオプションが供給され、それぞれの名前が対応する完全なパス名が印刷されています。複数のNAME引数が指定され-tた場合、NAMEはハッシュされたフルパス名の前に出力されます。この-lオプションにより、出力は入力として再利用できる形式で表示されます。引数が指定されていない場合、または-l提供されると、記憶されたコマンドに関する情報が出力されます。NAMEが見つからないか、無効なオプションが指定されない限り、戻りステータスはゼロです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.