除了 PATH 变量之外,还有哪些可能导致命令未找到错误的原因?

除了 PATH 变量之外,还有哪些可能导致命令未找到错误的原因?

在 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不存在)

  • 我尝试更改PATHvscode (在 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

pdf乳胶 pdf乳胶

压缩包 压缩包

乌尔克斯VT 在此输入图像描述

答案3

我认为原因是容器,正如 @polemon 在他的评论中建议的那样。 (更多信息请参见:https://www.redhat.com/en/topics/containers/whats-a-linux-container

这是因为我通过 flatpak 安装了 vscode,它使用容器来运行其应用程序。

感谢大家提供了一些意见并帮助使这一点变得更加清晰。

相关内容