web-dev-qa-db-ja.com

Java / usr / bin / javaからの場所

私の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

2つのコマンドの違いは何ですか?

20
user1050619

どの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を使用してリンクを削除します。

21
Dani_l

readlink -f

指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることにより、パスを正規化します。最後のコンポーネントを除くすべてが存在する必要があります

whichが検索します

bash(1)と同じアルゴリズムを使用して、環境変数PATHにリストされているディレクトリ内の実行可能ファイルまたはスクリプトの場合

whichは、見つけたものがシンボリックリンクであるかどうかに関係なく、実行可能であるだけです。これは、出力するパスが常にPATHのいずれかのディレクトリ内にあることを保証します。

システムでは、/usr/bin/Java/usr/lib/jvm/Java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/Javaへの symlink です。このように2つのコマンドを組み合わせると、 substitutewhichの出力がreadlink -fのコマンドラインに出力され、次のようになります。

readlink -f /usr/bin/Java

つまり、whichは、Javaと呼ばれる最初の実行可能ファイルがPATHにある場所を見つけ、シェルはそのパスをreadlink -fへの引数として挿入しました。次に、readlinkはパスを検索し、それが シンボリックリンク であることを確認します。そのため、そのリンク(および他のすべてのリンク)を解決して、実際のファイル自体への完全な直接パスを生成します。 。

ほとんどすべての目的で、これらのパスは交換可能です-シンボリックリンクJavaは、使用時に実際のパスに自動的に解決され、ファイル自体の変更は、パッケージマネージャーではなく、パッケージマネージャーによって行われますあなた、だからあなたはそれを見る必要はありません。どちらのパスからでも、またはJavaだけでプログラムを実行しても、最終的に実行される実際の実行可能ファイルと同じであるため、結果はまったく同じになります。

JREには通常の構成では互いに隣接させたいファイルのセット全体があり、シンボリックリンクによりパッケージマネージャーは/usr/bin内に実際のファイルを置くのではなく、パッケージマネージャーがシンボリックリンクを使用します。ユーザーとしてのあなたに通常の外観の配置。 /usr/lib/jvm/Java-1.6.0-openjdk-1.6.0.0.x86_64の内部には、処理する理由がまったくなく、システムの通常のライブラリ配置に参加しない他の多くのファイルがあります。

6
Michael Homer

この1行のコマンド:

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そして最後のものを返します。
0
Marek Podyma