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つのコマンドの違いは何ですか?
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
。このように2つのコマンドを組み合わせると、の出力をコマンドラインに置き換えて作成します。which
readlink -f
readlink -f /usr/bin/java
つまり、which
最初に呼び出される実行可能ファイルがどこ発見したjava
、あなたの中にありPATH
、そしてシェルは引数としてそのパスを挿入していますreadlink -f
。readlink
次に、パスを検索し、それがシンボリックリンクであることがわかります。そのため、そのリンク(および見つかった他のリンク)を解決して、実際のファイル自体への完全な直接パスを生成します。
ほとんどすべての目的で、これらのパスは交換可能です-シンボリックリンクjava
は使用時に実際のパスに自動的に解決され、ファイル自体の変更はあなたではなくパッケージマネージャーによって行われるため、それを見るために。どちらのパスからでも、またはjustを使用してプログラムをjava
実行しても、最終的に実行される実際の実行可能ファイルと同じであるため、結果はまったく同じになります。
/usr/bin
JREには異常な構成で隣り合うファイルのセットがすべてあるため、パッケージマネージャーは実際のファイルを置くのではなくシンボリックリンクを使用します。ユーザーとしてあなた。内部には他/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
に対処する理由がなく、システムの通常のライブラリ配置に参加しない他の多くのファイルがあります。