当寻找的路径,可执行文件或检查,如果你在Unix shell中输入命令的名称会发生什么,有不同的公用事业过多(which,type,command,whence,where,whereis,whatis,hash,等)。
我们经常听说which应该避免。为什么?我们应该用什么来代替?
如果您运行hash它,它会显示自上次重置哈希后运行的所有命令的路径 ( hash -r)
[root@c04c ~]# hash
hash: hash table empty
[root@c04c ~]# whoami
root
[root@c04c ~]# hash
hits command
1 /usr/bin/whoami
[root@c04c ~]# whoami
root
[root@c04c ~]# hash
hits command
2 /usr/bin/whoami
Run Code Online (Sandbox Code Playgroud)
根据手册页,哈希的目的是:
/usr/bin/hash 实用程序影响当前 shell 环境记住找到的实用程序位置的方式。根据指定的参数,它将实用程序位置添加到其记住的位置列表或清除列表的内容。当没有指定参数时,它报告列表的内容。该
-r选项会导致外壳忘记所有记住的位置。散列不报告作为 shell 内置程序提供的实用程序。
除了查看我输入了多少次命令之外,我看不到hash.
它甚至出现在 thegeekstuff.com 的前 15 个有用命令中
在哪些方面hash有用?
请注意,这不是重复的。我问的是禁用缓存,而不是清除它。如果您有一个缓存要清除,那么它显然没有被禁用。
在极少数情况下,我注意到 bash 缓存了它在路径中找到的东西,这不是因为它有帮助,而是因为它非常烦人。一个例子:
~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在另一个壳...
~ dc$ which which
/usr/bin/which
Run Code Online (Sandbox Code Playgroud)
我确信这种缓存在过去的美好时光里是有意义的,当时磁盘速度缓慢,内存昂贵且有限,因此您无法缓存太多 - 缓存路径比缓存查找命令所需的所有磁盘块便宜. 但是现在,它没有提供明显的好处,并且引起的问题比它解决的问题还多。这是一个错误的功能,几乎是一个错误。
我什至找不到禁用它的方法。任何指针?
我想aria2c通过将其复制到手动安装/usr/local/bin,因为我使用 apt 安装了 aria2c/usr/bin
如果我输入其中哪一个将被执行aria2c?
我有一个调用的脚本jsl在/usr/local/bin。运行which jsl在那里找到它。
我想暂时使用一个不同的版本,当echo $PATH我看到它/usr/bin在路径的早期。所以我添加了一个jsl在该文件夹中调用的脚本,并且我已经验证它是可执行的并且在使用完整路径调用时可以正确运行。
但是,which jsl仍然找到第一个版本,并且jsl仍然运行它。
为什么我的新人jsl没有which被姓名发现或被处决?
这次我curl http://npmjs.org/install.sh | sudo sh从 dir运行了“信任”安装脚本/。
$ which npm
/usr/local/bin/npm
$ npm
bash: /home/steven/local/bin/npm: No such file or directory
$ echo $PATH
/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ ls /home/steven/local/bin
node node-waf
$ ls /usr/local/bin
node node-waf npm npm_g npm-g
Run Code Online (Sandbox Code Playgroud)
似乎某个地方的某个脚本正在污染我的$PATH. 我想知道的是,如果bash在它查找的第一个目录中找不到该程序,它不是一直在查看$PATH吗?应该可以在里面找到/usr/local/bin!
npm真的,真的似乎不想只是工作。我想我要去加载一个稍微旧的 Ubuntu 并再试一次......
Mac下的环境如下:
~$
~$
~$ echo $0
-bash
~$
~$
~$
~$
~$
~$ cat /etc/paths.d/go
/usr/local/go/bin
~$
~$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Users/MYUSER/go/bin
~$
~$
~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/MYUSER/go/bin:/usr/local/go/bin
~$
~$ uname -a
Darwin XYXYXYXXYX 19.6.0 Darwin Kernel Version 19.6.0: Mon Apr 12 20:57:45 PDT 2021; root:xnu-6153.141.28.1~1/RELEASE_X86_64 x86_64
~$
~$ which go
/usr/local/go/bin/go
~$
~$
~$
~$ go version
-bash: /usr/local/bin/go: No such file or directory
~$
~$
~$
~$ /usr/local/go/bin/go version
go version go1.16.4 darwin/amd64
~$ …Run Code Online (Sandbox Code Playgroud)