
私の~.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 somecommand
でsomecommand
指定されたパスにハッシュパスを設定します。somepath
bash
PATH
これは通常、2つのディレクトリ間の検索順序を変更するのには役立ちません。これは、hash -p
両方のディレクトリに表示されるすべてのバイナリに対してこれを使用する必要があるためです。そのようなバイナリが1つしかない場合は、実行可能なオプションにすることができます。より移植性の高い解決策は、単にPATH
2番目のディレクトリの値を前に追加することです。
オリジナル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