私の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つのコマンドの違いは何ですか?
どの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
を使用してリンクを削除します。
指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることにより、パスを正規化します。最後のコンポーネントを除くすべてが存在する必要があります
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
の内部には、処理する理由がまったくなく、システムの通常のライブラリ配置に参加しない他の多くのファイルがあります。
この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
そして最後のものを返します。