「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

おすすめ記事