我注意到 Linux shell 命令“which”没有显示可执行文件,尽管它已经在搜索路径上。
更具体地说,我的 $PATH 包括 '~/.local/bin';可执行文件是 ~/.local/bin/charm。'which charm' 不返回任何内容,尽管我可以毫无问题地运行 'charm'。我正在使用 Ubuntu 16.04 和 bash
该问题取决于 Linux 发行版。如果我登录到另一台 RHEL 6.10 机器,则命令“which charm”对同一可执行文件有效。
该问题也可能与 nfs 挂载有关。在 Ubuntu 16.04 上,命令“which”似乎可以很好地处理本地磁盘上的可执行文件,例如,“which which”显示“/usr/bin/which”,但它找不到 nfs 路径上的可执行文件,我的“~/.local/bin”就是这种情况。
我在网上搜索,但找不到解释。有没有办法让 Ubuntu 下的命令“which”显示路径上所有已安装的可执行文件,包括 nfs 挂载?
谢谢!
答案1
您的$PATH
包含~/.local/bin
部分中的波浪号尚未扩展。bash
每次都会动态地扩展它,但是which
(至少在 Ubuntu 上)sh
不会。
如果你想which
查看其中的可执行文件,~/.local/bin
你需要确保波浪号已展开前变量PATH
获取它。该字符串可能是由某个启动脚本~/.local/bin
添加到您的。找到相关行并根据以下示例进行修复。PATH
注意:首先在新的 shell 中运行以下每个示例,这样您就可以观察(echo "$PATH"
)它每次如何独立地改变变量。
这不会扩展波浪符号(因为引用):
PATH="~/.local/bin:$PATH"
这会:
PATH=~/".local/bin:$PATH"
或这个:
PATH=~/.local/bin:$PATH
波浪线扩展规则有些复杂。考虑使用$HOME
。示例:
PATH="$HOME/.local/bin:$PATH"
PATH="$PATH:$HOME/.local/bin"
要修复已建立的PATH
变量,请将~
其替换为以下内容$HOME
:
PATH="${PATH/\~/$HOME}"