![除了 PATH 变量之外,还有哪些可能导致命令未找到错误的原因?](https://linux22.com/image/196044/%E9%99%A4%E4%BA%86%20PATH%20%E5%8F%98%E9%87%8F%E4%B9%8B%E5%A4%96%EF%BC%8C%E8%BF%98%E6%9C%89%E5%93%AA%E4%BA%9B%E5%8F%AF%E8%83%BD%E5%AF%BC%E8%87%B4%E5%91%BD%E4%BB%A4%E6%9C%AA%E6%89%BE%E5%88%B0%E9%94%99%E8%AF%AF%E7%9A%84%E5%8E%9F%E5%9B%A0%EF%BC%9F.png)
在 Linux 中找不到命令的可能原因有哪些?除此之外,它不在PATH
?
一些背景信息:
当尝试从 vscode 执行 pdflatex 时,我遇到了一些麻烦,vscode 无法找到 pdflatex。可能是因为PATH
设置不正确。由于我无法立即解决该问题,因此我尝试通过执行 shell 脚本来解决此问题,然后该脚本调用 pdflatex:
#!/bin/bash
export PATH=/usr/bin
pdflatex $@
或者
#!/bin/bash
/usr/bin/pdflatex $@
在这两种情况下,脚本在普通终端上执行时都会按预期工作。但是当在 vscode intern 终端中执行时,它会说
pdflatex: command not found
据我所知,找不到命令的唯一方法是它不在PATH
.或者当绝对路径错误时。但这里的情况似乎并非如此。那么还有哪些其他因素可以确定如何搜索命令呢?
附加信息(根据要求)
操作系统:POP操作系统21.04
从 vscode 终端:
$ echo $PATH /app/bin:/usr/bin:/home/flo/.var/app/com.visualstudio.code
从本机终端:
$ echo $PATH /opt/anaconda3/bin:/opt/anaconda3/condabin:/home/flo/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
其他命令如
ls
,也在/usr/bin
目录中,可以从 vscode 内部终端(以及ls
)工作/usr/bin/ls
。pdflatex的属性:
$ ls -l /usr/bin/pdflatex lrwxrwxrwx 1 root root 6 Feb 17 2021 /usr/bin/pdflatex -> pdftex
或者
$file /usr/bin/pdflatex /usr/bin/pdflatex: symbolic link to pdftex
和 pdftex (与 pdflatex 行为相同):
$ ls -l /usr/bin/pdftex -rwxr-xr-x 1 root root 2115048 Mar 13 2021 /usr/bin/pdftex
或者
$ file /usr/bin/pdftex /usr/bin/pdftex: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=88c89d7d883163b4544f9461668b73383e1ca04e, for GNU/Linux 3.2.0, stripped
以下脚本也给出相同的输出:
#!/bin/bash pdflatex $@
原始脚本(复制的,没有任何编辑)如下:
#!/bin/bash #export PATH=/usr/bin #printenv PATH pdflatex $@ #/usr/bin/pdflatex $@
为了测试其他脚本,我更改了评论并删除了此处帖子中不相关的行。
/app/bin
做不是存在。 (/app
不存在)我尝试更改
PATH
vscode (在 LaTeX Workshop 扩展内)中的 ,因为这很可能是我的问题的首要原因。然而,我既无法解决问题,也无法以任何方式确认我的配置(用于 LaTeX Workshop 扩展)有任何效果。将以下行添加到脚本时(
makeTex.sh
是我的包装脚本):declare -p LD_LIBRARY_PATH declare -p LD_PRELOAD
输出如下: 本机终端:
./makeTex.sh: line 4: declare: LD_LIBRARY_PATH: not found ./makeTex.sh: line 5: declare: LD_PRELOAD: not found
vscode 终端:
declare -x LD_LIBRARY_PATH="/app/lib" ./makeTex.sh: line 5: declare: LD_PRELOAD: not found
使用 vscode 1.57.1(通过 flatpak 安装)时出现该问题。其他版本的 vscode(至少 vscodium 1.60.1)可以不是表现出相同的行为。
答案1
有趣的是,我遇到过在一个过度配置的 zsh 环境(使用 oh-my-zsh)中安装新软件包后找不到新命令的经历。我可以确认这不是 zsh 中的默认行为。显然,zsh 中有可用命令的“缓存”,可以将其配置为不自动刷新。
一些愚蠢的 Ricer 认为,在一般情况下,防范 nfs 上的路径状况或内存匮乏的系统状况是明智的。我不喜欢 oh-my-zsh 以及人们安装并热衷的所有这些花哨的提示样式/配置。该死的炒作软件。
我想你的问题在这里得到了解答:
确保您没有取消设置 hash_list_all (...)
zstyle ":完成:*:命令" rehash 1
就我而言,我可以按照此答案中的说明检查上述选项:
$ unsetopt | grep hash; echo ---; setopt | grep hash
nohashcmds
nohashdirs
hashexecutablesonly
nohashlistall
---
另一种可能性是环境被清除/初始化与您期望的 IDE 不同。然而, /usr/bin 不在 PATH 中似乎很奇怪。创建一个新脚本,从 IDE 运行它并打印环境来确认您的假设:
env > /tmp/env-in-script-from-ide
答案2
你的环境很混乱。
从内部终端运行以下命令并验证输出(您不必用 head 截断路径输出)。使用 pdflatex 而不是 gzip,或者两者都尝试。如果你的普通终端和可视化代码终端的输出不同,那是因为环境不同。
我猜您是通过 Snap 安装了可视代码,并且环境有限或隔离。
$ env | grep ^PATH= | tr : \\n | head -n 3; echo; which gzip; gzip --version | head -n1 ; echo $SHELL
PATH=vendor/bin
node_modules/.bin
/home/jaroslav/bin
/bin/gzip
gzip 1.10
/bin/bash
在我的环境中,这可以完美地工作。可视化代码终端和 urxvt 中的输出是相同的。
$ env | grep ^PATH= | tr : \\n | head -n 3; echo; which pdflatex; pdflatex --version | head -n1 ; echo $SHELL
PATH=vendor/bin
node_modules/.bin
/home/jaroslav/bin
/usr/bin/pdflatex
pdfTeX 3.141592653-2.6-1.40.22 (TeX Live 2021 Gentoo Linux)
/bin/bash
答案3
我认为原因是容器,正如 @polemon 在他的评论中建议的那样。 (更多信息请参见:https://www.redhat.com/en/topics/containers/whats-a-linux-container)
这是因为我通过 flatpak 安装了 vscode,它使用容器来运行其应用程序。
感谢大家提供了一些意见并帮助使这一点变得更加清晰。