「ln」と「ln -s」の一貫性のない動作

「ln」と「ln -s」の一貫性のない動作

私たちが知っているように、このlnコマンドはリンクを生成し、デフォルトはハードリンクで、オプションは-sシンボリックリンクを生成します。一般的な構文は、ln [-s] OLD NEWOLD がリンクしたいファイルで、NEW が作成したい新しいファイルです。互いに内部のフォルダ間にハードリンクを作成できるため、ディレクトリへのハードリンクを作成する方法はありません。コンピュータにはまだ深刻な速度を落とさずにこれを確認するためのリソースがないようです。

リンクを作成するときは、両方のファイルの絶対パスまたは相対パスを作成する必要があります。相対パスと絶対ファイルパスを混在させることができます。つまり、新しいファイル/フォルダの相対パスと古いファイル/フォルダの絶対パスを混在させることができます。相対パスを使用してハードリンクを作成すると、2つのファイルのパスは現在のフォルダに基づいていますが、シンボリックリンクを使用するとリンクされたファイル/フォルダのパスは親フォルダに基づいていますが、古いファイル/フォルダのパスはフォルダですは現在のフォルダの相手です。これが私の質問と「関連する」理由は何ですか?

/home/userたとえば、HOMEフォルダ(とも呼ばれる)に~2つのフォルダを作成し、ファイルがnewフォルダにnew2あるとします。すると、現在存在しないリンクへのリンクが失われます。ただし、代わりに実行すると予想される結果、つまりfromのリンクが得られます。filenewln -s new/file new2/file~/new2/file~/new2/new/fileln -s ../new/file new2/file~/new2/file~/new/file

だから私の質問は次のとおりです。

シンボリックリンクのOLDファイル/フォルダのファイルパスは親フォルダに基づいており、他の3つのパス(ハードリンクOLD、NEWファイル、シンボリックリンクNEWファイル/フォルダ)は現在のフォルダに基づいているのですか?

これはすべてFedoraで行われましたが、ほとんどのUNIXベースのオペレーティングシステムでも機能すると確信しています。

編集するE Carter Youngは私の2番目の質問(そして私の最初の質問はとにかく間違っていた)にぴったりです。シンボリックリンクの場合、ターゲットが存在する必要はないため、システムは現在のディレクトリではなくリンクへの相対パスを作成する必要があります。しかし、ユーザーがパスが何であるかを見つけて直接入力するように強制するのではなく、コマンドを実行したときにシェルがパスを確認しないのはなぜですか?シェルがうまく解析されているようです。これはレガシー問題ですか?パフォーマンスの問題?何?

答え1

マンページを読んでください。質問1 =最初のフォームは、これはLinuxでは、すべてのエントリ、ディレクトリもファイルとして扱われるためです。たとえば、/etc/ をテキストエディタとして「開く」(nano -w /etc/ nano など) は、/etc/ がディレクトリであることを丁寧に伝えます。これは、無限のシンボリックリンクを作成することが技術的に正当であるためです。過去には、スコープチェックを作成する前に、/etcという名前の2つのファイル(1つはファイル、1つはディレクトリ)を持つFHSシステムを持つことができ、システムは違いを知っていました。

(ㅋㅋㅋコメントを見てくださいChromiumos開発者ガイド:

~/trunk で chroot を再検索できるので、ファイルシステムループがあります。これについてあまりにも長い間考えないでください。 du -s ${HOME}/chromiumos/chroot/home を使用しようとすると、ファイルシステムの破損に関するメッセージが表示されることがあります。これは心配する必要はありません。コンピュータがループを理解していないという意味にすぎません。 (このサイクルを理解できたら、もっと難しいことを試してください。

より難しいものをクリックしてみてください:)ループを避けるために、lnにはフルパスが必要です。

質問2は、マニュアルページをもう一度読んで最後の文章を見ると答えることができます。

説明する

   In the 1st form, create a link to TARGET with the name LINK_NAME.  In
   the 2nd form, create a link to TARGET in the current directory.  In
   the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
   Create hard links by default, symbolic links with --symbolic.  By
   default, each destination (name of new link) should not already
   exist.  When creating hard links, each TARGET must exist.  Symbolic
   links can hold arbitrary text; if later resolved, a relative link is
   interpreted in relation to its parent directory.

返信:編集:「しかし、ユーザーがパスが何であるかを見つけて直接入力するように強制するのではなく、コマンドを実行したときにシェルがパスを確認できないのはなぜですか?」


次の例を考えてみましょう。アプリケーションAはライブラリバージョン1.0.aをインストールします。ライブラリAに依存するアプリケーションX、Y、Zを構築します。アプリケーションAはバグを見つけて更新し、ライブラリを1.0.1.2.aとして保存します。アプリケーション後

ln -s /usr/lib64/libfoo-1.0.1.2.a /usr/lib64/libfoo-1.0.a

アプリケーションX、Y、Zも適用されたライブラリから新しいバグ修正を受け取ります。シェルは1.0から1.0.1.2までのリンクに従いますが、これを1.0と呼ぶためです。この場合、システム全体の損傷の可能性が高くなるため、シェルがそのパスを想定したくありません。ちなみに、64ビットシステムの/ usr / libは/ usr / lib64に接続され、提供したばかりの大規模な例を修正します。ここでは、32ビットアプリケーションはライブラリが/ usr / libにインストールされることを期待していますが、64ビットシステムに純粋な32ビットライブラリがないため、/ usr / libは次のように/ usr / lib64に接続します。

ln -s /usr/lib64 /usr/lib

答え2

Q1:ソフトリンクは両方のファイル/フォルダのフルパスを作成する必要がありますが、ハードリンクがターゲットファイルのファイル名を省略できるのはなぜですか?

また、ターゲットが現在のディレクトリにない場合は、ソフトリンクのパスまたはファイル名を指定する必要はありません。たとえば、ファイルがある場合は、~/Downloads/target_file次のことができます。

ln `~/Downloads/target_file`

これはあなたがするときに~/生成されますハードリンクファイル名を追加してください。これを行うこともできます~/Downloads/target_file~/target_file

ln -s `~/Downloads/target_file`

これはあなたがするときに~/生成されますソフトリンクファイル名~/Downloads/target_fileで入力してください。~/target_file

質問2:ソフトリンクOLDファイル/フォルダのファイルパスは親エントリに相対的なのに対し、他の3つのパス(ハードリンクOLD、NEWファイル、ソフトリンクNEWファイル/フォルダ)は、次のように固定されたファイル/ファイルに相対的な理由は何ですか?彼ら自身?

4つのパスはすべて相対(現在のフォルダに基づいて)でも絶対でもかまいません。唯一の基準は、名前やパスを指定しない限り、ハードリンクやソフトリンクが同じフォルダにあってはならないことです。

あなたは読まなければなりませんマニュアルページから。 Ubuntu 14.04でこれをすべて試しましたが、まだマニュアルページで確認されているため、OSに限定されず、心配する必要はありません。

答え3

ハードリンクを作成するときは、リンクの作成時にソースパスが使用されるため、現在の作業ディレクトリへの相対パス(または絶対パス)である必要があります。シンボリックリンクを作成すると、ソースパスは文字列として扱われます。リンクを使用すると、リンクが配置されているディレクトリに基づいて解釈されます。

あなたの例を考えると、現在のディレクトリはです/home/user

  • このコマンドはln -s new/file new2/fileテキストを含むシンボリックリンクを作成しnew/file、そのリンクを場所に配置しますnew2/file。プログラムがリンクにアクセスすると、ターゲットは/home/user/new2/new/file存在しません。
  • このコマンドはln -s ../new/file new2/fileテキストを含むシンボリックリンクを作成し../new/file、そのリンクを場所に配置しますnew2/file。プログラムがリンクにアクセスすると、ターゲットは/home/user/new2/../new/fileに短縮されます/home/user/new/file
  • このコマンドは、同じファイル(必ず存在する必要があります)を指すln new/file new2/fileディレクトリエントリを生成します。new2/file/home/user/new/file

通常、シンボリックリンクを作成する前にターゲットディレクトリに変更するのはあまり混乱しません。

cd new2
ln -s ../new/file .

関連情報