`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따옴표로 인해 확장이 방지되지 않으므로 원래 셸에서 확장이 발생합니다. 쉘 sudo su -l -c 'echo $PATH'에서 확장을 수행 하려고 합니다 su.

후속 질문은 " java이것을 어떻게 실행합니까?" 가 될 것이라고 가정합니다. 전체 경로를 사용하여 java를 호출하거나 올바른 rc 파일(예: su -c '. /etc/bash.bashrc; java ...'.

답변2

dhag는 $PATH정확하지 않음에도 불구하고 올바른 것처럼 보이는 이유를 설명합니다.

경로가 변경되지 않는 이유는 su쉘이 대화식으로 실행되지 않기 때문일 가능성이 높습니다. 이는 bash.bashrc가 처음에 실행되지 않거나 실행되지 않는 것을 감지하여 아무것도 수행하기 전에 종료됨을 의미합니다. 대화식으로.

명령 이름 대신 전체 경로를 지정하거나 기본 경로가 설정된 위치를 찾아 변경해야 합니다.

관련 정보