ハッシュコマンドの目的は何ですか?

ハッシュコマンドの目的は何ですか?

実行すると、hash最後にハッシュがリセットされてから実行されたすべてのコマンドのパスが表示されます(hash -r)。

[root@c04c ~]# hash
hash: hash table empty

[root@c04c ~]# whoami
root

[root@c04c ~]# hash
hits    command
   1    /usr/bin/whoami

[root@c04c ~]# whoami
root

[root@c04c ~]# hash
hits    command
   2    /usr/bin/whoami

マニュアルページによると、ハッシュの目的は次のとおりです。

/usr/bin/hashユーティリティは、現在のシェル環境が見つかったユーティリティの場所を記憶する方法に影響します。指定された引数に従ってユーティリティの場所を記憶された場所のリストに追加するか、リストの内容を消去します。引数が指定されていない場合は、リストの内容を報告します。この-rオプションを使用すると、シェルが記憶されているすべての場所を忘れます。

シェルに組み込まれたユーティリティはハッシュを通じて報告されません。

コマンドを何回入力したかを見る以外は実用性がありませんhash

thegeekstuff.comにも紹介されています。最も便利な15のコマンド

どのような意味でhash役に立ちますか?

答え1

hashbashに組み込まれたコマンドです。ハッシュテーブルの機能の1つは、結果をメモリにキャッシュしてコマンドを入力するたびに取得する必要がbash なくなることです。$PATH結果を明確に無効にするイベント(変更など)の場合、テーブルは$PATH消去されます。

コマンドはhashシステムと対話する方法です(必要と思われる理由は何でも)。

いくつかのユースケース:

  • ご覧のとおり、引数なしでコマンドを入力すると、どのコマンドをクリックしたかが表示されます。これにより、最も頻繁に使用されるコマンドが何であるかがわかります。

  • また、それを使用して、非標準の場所にある実行可能ファイルを記憶することもできます。

例:

[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you’re thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#

実行するディレクトリ以外のディレクトリにのみ実行可能ファイルがある場合は、$PATHそのディレクトリ内のすべてのエントリを含めるのではなく、名前だけを入力すると$PATH便利です(追加する場合)。

エイリアスは通常同じことを行いますが、現在のシェルの動作を変更するため、起動するプログラムにマップされません。ここでは、別々の実行可能ファイルへのシンボリックリンクを選択する方が良いかもしれません。hash方法だ。

  • これを使用してファイルパスを忘れることができます。これは、新しい実行可能ファイルが以前のディレクトリに表示されたPATH場合、または別の場所に移動されたときにmv、bashにそれを見つけた最後の場所の代わりに再度検索させる場合に便利です。

例:

[root@policyServer ~]# hash
hits    command
   1    /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits    command
   1    /bin/cp
   1    /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif  newDIT.ldif  notes.txt  users.ldif
[root@policyServer ~]# hash
hits    command
   1    /bin/cp
   1    /lol-wut/ls
[root@policyServer ~]#

このコマンドを使用すると、以前のバージョンにcp実行可能ファイルの新しいバージョンが表示されましたが、ハッシュテーブルのクリーンアップは実行されませんでした。一度ハッシュテーブルから項目を選択的に削除したことがあります。その後、Bashは再度強制的に見つけなければなりません。そうすることで、新しい場所(以前の実行よりも$ PATH速い場所)で検索します。ls$PATHhash -dls$PATH

ただし、オプションで「実行ファイルの新しい場所を検索」$PATHアクションを呼び出すこともできます。

[root@policyServer ~]# hash
hits    command
   1    /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits    command
   0    /lol-wut/ls
[root@policyServer ~]#

これは、ハッシュテーブルから何かを取得しようとしていますが、100%ログアウトして正常に戻ることができない場合、またはシェルに対するいくつかの修正を保存したい場合にのみこれを行います。

古いマッピングを削除するには、bashのハッシュテーブル全体を効果的に消去するhash -r(または)操作を実行することもできます。export PATH=$PATH

このような小さな状況がたくさんあります。このコマンドを「最も便利な」コマンドの1つとして呼び出すことができるかどうかはわかりませんが、いくつかのユースケースがあります。

答え2

単純化された古典的な使用法は次のとおりです。

# My PATH contains /home/rici/bin as well as the Usual Suspects:
# (the real one has lots more)
$ echo $PATH
/home/rici/bin:/usr/local/bin:/usr/bin:/bin

# I've installed a program called hello in /usr/local/bin
$ $ cat /usr/local/bin/hello
#!/bin/bash

echo Hello, world. I live at $0

# The program works.
$ hello
Hello, world. I live at /usr/local/bin/hello

# Now I want to create a better hello, just for me. I put it in
# my own bin directory, and according to my PATH, it should come first.
$ cp /usr/local/bin/hello ~/bin/hello

# So now I will try running it
$ hello
Hello, world. I live at /usr/local/bin/hello

# WTF? Oh, forgot to run hash.
# Tell bash to update where to look for hello
$ hash hello
$ hello
Hello, world. I live at /home/rici/bin/hello

# Ah, all is well.

答え3

便利な使い方は次のとおりですhash

hash php 2> /dev/null || hash -p /usr/local/foobar/php/bin/php php 2> /dev/null

つまり、PHPがPATHにない場合は、次のようにします。

/usr/local/foobar/php/bin/

答え4

コマンドが使用可能かどうかを簡単に検出します。

CMD=gzip
if hash bzip2; then
    CMD=$_
fi

関連情報