Расположение 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

в чем разница между 2 командами?

user1050619
источник

Ответы:

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чтобы удалить ссылку, как вы бы удалили любой другой файл.

Dani_l
источник
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и возвращает последнюю.
Марек Подыма
источник