我有一个服务器,其中包含位于自定义位置的 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 要么首先没有被执行,要么在执行任何操作之前退出,因为它检测到它没有执行交互运行。
您要么必须指定完整路径而不是命令名称,要么找出默认路径的设置位置并在那里进行更改。