为什么即使 `sudo su -l -c "echo $PATH"` 显示了 java 二进制文件的位置,`sudo su -l -c "java"` 也不起作用?

为什么即使 `sudo su -l -c "echo $PATH"` 显示了 java 二进制文件的位置,`sudo su -l -c "java"` 也不起作用?

我有一个服务器,其中包含位于自定义位置的 tarball 中的 Java 二进制文件,以及以下内容/etc/bash.bashrc

export JAVA_HOME=/path/to/java/home
export PATH=$JAVA_HOME/bin:$PATH

当我跑步时sudo su -l -c "java",我得到了-su: java: command not found。但是,当我sudo su -l直接进入时,我可以运行java而没有错误。

此外,还sudo su -l -c "echo $PATH包括 的位置java

为什么sudo su -l -c "java"运行失败?

编辑:即使它是/etc/bash.bashrc和不是~/.bashrc,相同的推理也适用于链接的问题/答案。

答案1

当您运行sudo su -l -c "echo $PATH",时,$PATH会在原始 shell 中展开,因为双引号不会阻止这种展开。您想在 shellsudo su -l -c 'echo $PATH'中进行扩展su

我假设后续问题将是“那么我该如何java运行”?我建议要么使用其完整路径调用 java,要么通过手动尝试加载正确的 rc 文件(例如su -c '. /etc/bash.bashrc; java ...'.

答案2

dhag 解释了为什么$PATH看起来是正确的,尽管事实并非如此。

路径没有更改的原因很可能是su没有以交互方式运行 shell,这意味着 bash.bashrc 要么首先没有被执行,要么在执行任何操作之前退出,因为它检测到它没有执行交互运行。

您要么必须指定完整路径而不是命令名称,要么找出默认路径的设置位置并在那里进行更改。

相关内容