내 Linux 시스템에서 Java 위치를 찾으려고 하는데 다음과 같은 결과가 나왔습니다.
[980@b449 ~]$ which java
/usr/bin/java
[980@b449 ~]$ readlink -f $(which java)
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
이 두 명령의 차이점은 무엇입니까?
답변1
두 가지 명령은 무엇입니까?
/usr/bin/java
소프트(심볼릭) 링크이므로 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
동일한 파일이므로 차이가 없습니다.
다음과 같은 것을 입력하면
ls -l /usr/bin/java
다음과 같은 결과를 얻을 수 있습니다.
lrwxrwxrwx. 1 root root 22 Aug 5 17:01 /usr/bin/java -> /etc/alternatives/java
이는 시스템에 여러 Java 버전이 있고 대체 버전을 사용하여 기본 버전을 변경할 수 있음을 의미합니다. 그렇지 않은 경우 간단히 링크를 추가하고 제거하여 기본 링크를 수동으로 변경할 수 있습니다.
심볼릭 링크를 생성하려면 다음 명령을 사용하십시오.
ln -s /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java /usr/bin/java
또는 일반적인 형태
ln -s <original file> <link to file>
rm
다른 파일과 마찬가지로 삭제 링크를 사용하세요 .
답변2
지정된 이름을 가진 모든 구성 요소의 모든 기호 링크를 반복적으로 추적하여 경로를 정규화합니다. 마지막 구성 요소를 제외한 모든 구성 요소가 존재해야 합니다.
환경 변수 PATH에 나열된 디렉터리의 실행 파일이나 스크립트의 경우 bash(1)과 동일한 알고리즘이 사용됩니다.
which
찾은 것이 심볼릭 링크인지 여부는 중요하지 않으며 실행 가능하다는 점만 중요합니다. 인쇄되는 경로가 항상 에 있음을 보장합니다 PATH
.
/usr/bin/java
귀하의 시스템 에는심볼릭 링크도착하다 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
. 이렇게 두 명령을 결합하면바꾸다which
명령줄에서 출력을 만듭니다 .readlink -f
readlink -f /usr/bin/java
즉, 에서 which
처음으로 호출된 실행 파일 의 위치가 발견되었으며 쉘은 해당 경로를 인수로 삽입했습니다 . 그러다가 길을 찾아보니java
PATH
readlink -f
readlink
심볼릭 링크, 따라서 해당 링크(및 발견된 다른 링크)를 구문 분석하여 실제 파일 자체에 대한 전체 직접 경로를 생성합니다.
거의 모든 목적에서 이러한 경로는 상호 교환 가능합니다. java
심볼릭 링크를 사용하면 심볼릭 링크가 자동으로 실제 경로로 확인되고 파일 자체에 대한 수정 사항은 사용자가 아닌 패키지 관리자가 수행하므로 전혀 볼 수 없습니다. 두 경로 중 하나에서 프로그램을 실행하거나 다음을 java
사용하여 프로그램을 실행할 수 있습니다.
패키지 관리자는 실제 파일을 넣는 대신 심볼릭 링크를 사용합니다. /usr/bin
왜냐하면 JRE에는 비정상적인 구성으로 서로 옆에 있기를 원하는 전체 파일 세트가 있고 심볼릭 링크를 사용하면 패키지 관리자가 사용자의 일반적인 배열을 제시할 수 있기 때문입니다. 너. 거기에는 처리할 이유가 전혀 없는 다른 많은 파일이 있으며 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
시스템의 일반적인 라이브러리 배열에 참여하지 않습니다.
답변3
이 한 줄 명령은 다음과 같습니다.
which java | xargs readlink -f
당신을 위해 일을 할 것입니다.
which java
당신에게 다음을 제공합니다:/usr/bin/java
readlink -f
모든 심볼릭 링크/usr/bin/java
->/etc/alternatives/java
-> 를 순회/usr/lib/jvm/java-8-oracle/jre/bin/java
하고 마지막 링크를 반환합니다.