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