`hash -p`は外部コマンド名のパス名を変更しますか?

`hash -p`は外部コマンド名のパス名を変更しますか?

私の~.profile

PATH="/path/1/":"/path/2/":"$PATH"

/path/1/そして/path/2/両方とも同じ名前の実行可能ファイルを持っていますmyexecutable

非ログインインタラクティブシェルで一時的に2つのディレクトリ間の検索順序を変更したいと思います。

Bashのマニュアルによるとhash

-pオプションはパス検索を無効にし、ファイル名が名前の場所として使用されます。

私の方法は

$ hash -p /path/2/myexecutable
hits    command
   3    /usr/bin/which
   4    /usr/bin/psql
   1    /bin/cat
  10    /usr/bin/sudo
   1    /bin/mv
   1    /usr/bin/whereis
   3    /bin/mkdir
  19    /bin/ls

出力はと同じで変更されhashないようです。myexecutable/path/2/myexecutable

$ which myexecutable
/path/1/myexecutable

それではhash -p、実際には何をしますか?

ありがとうございます。

答え1

からhelp hash

ハッシュ:ハッシュ[-lr] [-pパス名] [-dt] [名前...]

-p pathname は、PATHNAME を NAME の絶対パス名として使用します。

だから:

$ hash -p   /path/2/myexecutable   myexecutable

やりたいことをします。

もちろん、実行可能ファイル名でいくつかのゲームをプレイできます。

$ hash -p   /bin/echo  myexecutable

echo電話したらすぐに実行してくださいmyexecutable

$ myexecutable Hello World
Hello World

答え2

$ touch file
$ ls
file
$ hash
hits    command
   1    /usr/bin/touch
   1    /bin/ls
$ hash -p /hello/world/ls ls
$ ls
bash: /hello/world/ls: No such file or directory

hash -p somepath somecommandsomecommand指定されたパスにハッシュパスを設定します。somepathbash

PATHこれは通常、2つのディレクトリ間の検索順序を変更するのには役立ちません。これは、hash -p両方のディレクトリに表示されるすべてのバイナリに対してこれを使用する必要があるためです。そのようなバイナリが1つしかない場合は、実行可能なオプションにすることができます。より移植性の高い解決策は、単にPATH2番目のディレクトリの値を前に追加することです。

オリジナルPATH

/path/1:/path/2:...

あなたはまずそれを

/path/2:/path/1:/path/2:...

その後、hash -rハッシュパスをリセットし、通常どおりバイナリを使用します。これで、このアイテムはからインポートせず/path/2にからインポートされます/path/1

PATH一時変数に保存すると、元のデータを簡単に復元できます。

要約:

oldpath=$PATH
PATH=/path/2:$PATH
hash -r

# do stuff

PATH=$oldpath
hash -r

関連情報