Java-Speicherort von / usr / bin / java

20

Ich versuche, meinen Java-Speicherort in meinem Linux-System zu finden und erhalte diesen

[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

Was ist der Unterschied zwischen den beiden Befehlen?

user1050619
quelle

Antworten:

21

welche 2 befehle? /usr/bin/javaist ein weicher (symbolischer) Link zu /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
Es gibt keinen Unterschied, da es sich um dieselbe Datei handelt.
Wenn Sie etwas wie eingeben

ls -l /usr/bin/java

Sie erhalten möglicherweise ein Ergebnis wie:

lrwxrwxrwx. 1 root root 22 Aug  5 17:01 /usr/bin/java -> /etc/alternatives/java

Das würde bedeuten, dass Sie mehrere Java-Versionen auf Ihrem System haben und Alternativen verwenden können, um die Standardversion zu ändern. Andernfalls können Sie Verknüpfungen einfach hinzufügen und entfernen, um die Standardverknüpfung manuell zu ändern.

Verwenden Sie den Befehl, um symbolische Verknüpfungen zu erstellen

ln -s /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java /usr/bin/java

Oder in allgemeiner Form

ln -s <original file> <link to file>

Verwenden rmSie diese Option, um den Link wie jede andere Datei zu löschen.

Dani_l
quelle
5

readlink -fwird :

Kanonisieren Sie einen Pfad, indem Sie jedem Symlink in jeder Komponente des angegebenen Namens rekursiv folgen. alle bis auf die letzte Komponente müssen vorhanden sein

whichwird suchen :

für eine ausführbare Datei oder ein Skript in den in der Umgebungsvariablen PATH aufgelisteten Verzeichnissen unter Verwendung desselben Algorithmus wie bash (1)

whichEs ist egal, ob es sich um einen Symlink handelt oder nicht: Nur, dass er ausführbar ist. Es wird garantiert, dass sich der Pfad, den es druckt, immer in einem der Verzeichnisse in befindet PATH.

Auf Ihrem System /usr/bin/javabefindet sich ein Symlink zu /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java. Wenn Sie die beiden Befehle zusammen wie diese kombinieren Sie ersetzen die Ausgabe whichin der Befehlszeile readlink -fzu erstellen:

readlink -f /usr/bin/java

Das heißt, es whichwurde gefunden, wo sich die erste aufgerufene ausführbare Datei javain Ihrer befindet PATH, und die Shell hat diesen Pfad als Argument für eingefügt readlink -f. readlinkDann wird der Pfad nachgeschlagen und festgestellt, dass es sich um eine symbolische Verknüpfung handelt. Daher wird diese Verknüpfung (und alle anderen gefundenen Verknüpfungen) aufgelöst, um einen vollständigen direkten Pfad zur eigentlichen Datei selbst zu erstellen.

Für fast alle Zwecke sind diese Pfade für Sie austauschbar - der Symlink javawird automatisch in den tatsächlichen Pfad aufgelöst, wenn Sie ihn verwenden, und Änderungen an der Datei selbst werden von Ihrem Paketmanager vorgenommen und nicht von Ihnen Es zu sehen. Sie könnten das Programm entweder über den Pfad oder mit nur ausführen java, und das Ergebnis wäre genau das gleiche, da es letztendlich dieselbe ausführbare Datei ist, die auch ausgeführt wird.

Der Paketmanager verwendet einen Symlink, anstatt die eigentliche Datei darin abzulegen, /usr/binda die JRE eine ganze Reihe von Dateien in ungewöhnlichen Konfigurationen nebeneinander hat, und ein Symlink ermöglicht es dem Paketmanager, eine normal aussehende Anordnung zu präsentieren Sie als Benutzer. Es gibt viele andere Dateien in der /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64Bibliothek, mit denen Sie sich nie befassen müssten und die nicht an den üblichen Bibliotheksarrangements des Systems beteiligt sind.

Michael Homer
quelle
0

Dieser einzeilige Befehl:

which java | xargs readlink -f

erledigt die Arbeit für Sie.

  • which java gibt dir zB: /usr/bin/java
  • readlink -fDurchläuft alle symbolischen Links /usr/bin/java-> /etc/alternatives/java-> /usr/lib/jvm/java-8-oracle/jre/bin/javaund gibt den letzten zurück.
Marek Podyma
quelle