在我的~.profile里
PATH="/path/1/":"/path/2/":"$PATH"/path/1/和/path/2/都有同名为myexecutable的可执行文件。
在非登录交互shell中,我想在两个目录之间临时交换搜索顺序。
hash使用Bash手册
-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实际上是做什么的呢?
谢谢。
发布于 2018-05-24 22:21:43
来自help hash:
散列:散列-p路径名使用pathname作为名称的完整路径名
所以:
$ hash -p /path/2/myexecutable myexecutable做你想做的事。
当然,您可以使用可执行名称玩一些游戏:
$ hash -p /bin/echo myexecutable无论何时调用echo,都会运行myexecutable。
$ myexecutable Hello World
Hello World发布于 2018-05-25 05:52:49
$ 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 directoryhash -p somepath somecommand将somecommand的散列路径设置为bash中的给定路径somepath。
这通常无助于扭转两个目录之间的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 -rhttps://unix.stackexchange.com/questions/445865
复制相似问题