在我的~.profile
PATH="/path/1/":"/path/2/":"$PATH"
/path/1/
并且/path/2/
两者都有同名的可执行文件myexecutable
。
在非登录交互式 shell 中,我想暂时交换两个目录之间的搜索顺序。
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
两个目录之间的搜索顺序,因为您必须hash -p
对两个目录中出现的所有二进制文件使用。如果您只有一个这样的二进制文件,那么它可能是一个可行的选择。更可移植的解决方案是简单地将PATH
第二个目录的值添加到前面。
如果你的原件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