私の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つのコマンドの違いは何ですか?
答え1
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
他のファイルと同様に、削除リンクを使用してください。
答え2
指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを繰り返し追跡してパスを正規化します。最後のコンポーネントを除くすべてのコンポーネントが存在する必要があります。
環境変数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
。この2つのコマンドを組み合わせると変える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
システムの一般的なライブラリ配列には参加しません。
答え3
この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
、最後のリンクを返します。