我安装了当前版本的 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"
然后我继续删除texlive
apt-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
。