Lubuntu Xenial。我似乎弄乱了我的系统 perl。cpan 返回:
bash: /usr/local/bin/cpan: no such file or directory
(我从该目录中的源代码构建了一个较新的 perl 版本,但又将其删除了)。
apt-get install perl --reinstall
似乎做了正确的事情,但没有解决问题。我不敢先清除 perl 并重新安装它,因为 apt 可能依赖它。
我能做些什么?
答案1
TL;DR:运行hash -r
或仅启动一个新 shell 通常可以解决此问题。
如果该文件确实消失了,那么 shell 很可能仍然对其进行了哈希处理。
首先我建议你确认它/usr/local/bin/cpan
确实消失了:
ls -l /usr/local/bin/cpan
如果那里有东西,则说明您没有完全卸载。如果那里什么都没有,那么您将收到以下消息:
ls: cannot access '/usr/local/bin/cpan': No such file or directory
假设你收到了这条消息,但在你输入并按下时bash
试图运行,问题很可能是/usr/local/bin/cpan
cpan
Enterbash
仍有那条路哈希。shell 通常会散列其位置,而不是每次都查找外部命令的位置。因此,您可以通过以下方式解决问题:告诉bash
“重新讨论”,通过运行:
hash -r
或者直接启动一个新 shell。
如果这不起作用,请检查它是否是别名或 shell 函数。
如果文件不再存在,哈希值也不再变化,则很可能cpan
是一个充当包装器的别名或 shell 函数/usr/local/bin/cpan
。要确定这一点,请运行:
type -a cpan
如果它是别名或 shell 函数,则会显示定义。然后,unalias cpan
如果它是别名或unset -f cpan
shell 函数,您可以使用取消设置它。
您最终将希望从包含该定义的启动脚本中删除该定义。通常它将位于.bashrc
您的主目录中的文件中。别名有时在 中定义。(有时人们在、或.bash_aliases
中定义别名和 shell 函数,尽管这不是一个很好的做法。).profile
.bash_profile
.bash_login
如果这不起作用,请考虑您正在如何运行cpan
或处于什么 shell 中。
如果文件不见了,仍然没有散列,不是别名或 shell 函数,并且type -a
没有揭示问题,那么很可能您 (a) 没有cpan
直接通过该命令运行,或者 (b) 使用了除 之外的 shell bash
。在前一种情况下,没有进一步的详细信息就无法回答。
后一种情况似乎不太可能,因为你的 shell调用自己 bash
,尽管偶尔有人会不明智地创建一个指向bash
非 shell 的符号链接(这是不明智的)。事实是,我主要是为了其他读者的利益而提到这一点。根据该消息,您几乎肯定会使用bash
。
但是,如果你没有或者可能没有,请运行echo "$BASH_VERSION"
以查看你是否正在运行bash
- 这应该在其他 shell 中取消设置 - 并echo "$SHELL"
查看你的默认shell 是。重新哈希的工作方式不同——或者至少是已实现在其他 shell 中则不同。
其他一些 Bourne 风格的 shell,喜欢zsh
,有一个rehash
命令,你会运行而不是hash -r
。这也是你如何导致重新哈希发生在csh
和tcsh
。