`hash -p` 是否更改外部命令名称的路径名?

`hash -p` 是否更改外部命令名称的路径名?

在我的~.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给定路径。somepathbash

这通常不会帮助您反转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

相关内容