Розташування Java від / usr / bin / java


20

Я намагаюся знайти своє місце розташування Java в моїй системі Linux і отримав це

[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

яка різниця між двома командами?

Відповіді:


21

які 2 команди? /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для видалення посилання так само, як і будь-який інший файл.


5

readlink -fбуде :

канонізувати шлях, слідуючи за кожним символьним посиланням у кожному компоненті даної назви рекурсивно; всі, крім останнього компонента, повинні існувати

whichбуде шукати :

для виконуваного файлу або сценарію в каталогах, перелічених у змінній середовища 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якими ви ніколи не матимете жодних підстав мати справу, і які не беруть участі у звичайних бібліотечних системах системи.


0

Ця командна лінія:

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і повертає останнє.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.