Bash 拒绝执行正确的二进制文件

Bash 拒绝执行正确的二进制文件

我安装了当前版本的 texlive (2012),它将二进制文件安装到 中/usr/local/texlive/2011/bin/i386-linux/。随后,我通过修改文件将此目录添加到 PATH 变量中/etc/environment,因为我希望为所有用户安装此目录:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/texlive/2012/bin/i386-linux"

然后我继续删除texliveapt-suite 软件包,因为当我尝试编译文档时出现错误.tex,显示 texlive 2009 发行版已与我的 Lubuntu 12.04 一起预先打包。

现在发生了一些非常奇怪的事情:

~ which pdflatex
/usr/local/texlive/2012/bin/i386-linux/pdflatex

看来二进制文件已经被找到了。但仍然发生了以下情况:

~ pdflatex foo.tex
/usr/bin/pdflatex: File not found!

它为什么会查看/usr/bin/? 这是二进制位置的某种bash内部缓存吗 (我依稀记得听说过这件事)?

有什么可能的解决办法?

答案1

Bash 确实有一个最近查找过的程序的“缓存”。您可以使用hash -r在 shell 中清除此缓存。替代方案:

  • 只需关闭当前 shell 并打开一个新 shell 即可。
  • 提供完整路径,例如:/usr/bin/pdflatex file.tex

which是一个外部程序。它将始终报告程序在当前状态下匹配。要调查 shell 执行了哪个命令,请使用type内置命令。

缓存的演示:

$ acpidump
/usr/bin/acpidump
$ 类型 acpidump
acpidump 是 /usr/bin/acpidump
$ acpidump -h &>/dev/null # 触发查找
$ 类型 acpidump
acpidump 是散列(/usr/bin/acpidump)
$ mv ~/bin/acpidump{.x,} # 使 acpidump 在 PATH 中可用
$ acpidump
/主页/彼得/bin/acpidump
$ 类型 acpidump
acpidump 是散列(/usr/bin/acpidump)
$哈希-r                # 清除缓存
$ 类型 acpidump
acpidump 是 /home/peter/bin/acpidump

答案2

/usr/bin/pdflatex很有可能符号链接指向您刚刚删除的包,而该包又不存在。尝试ls -l /usr/bin/pdflatex查看它是否指向另一个文件。如果它是一个损坏的符号链接(目标不存在),您可以直接删除它,然后运行pdflatex下一个。PATH

which实际上是在寻找PATH其中的第一个可执行文件存在。换句话说,如果您ln -s /non-existing/path /usr/local/sbin/pdflatex它将会被 忽略which,尽管/usr/local/sbin是 中的第一个PATH

相关内容