"ls -L" このリンクが指すファイル名ではなく、リンク自体の名前を印刷するのはなぜですか?

"ls -L" このリンクが指すファイル名ではなく、リンク自体の名前を印刷するのはなぜですか?

ソフトリンクの「長い」リストを実行すると、ls -lソフトリンクのファイルプロパティが表示されます。ls -lL(または)を実行すると、ls -l --dereferenceファイル属性はリンクが指すファイルの属性になりますが、lsリンク自体の名前は出力され続けます。ページmanにはこれについて何も言及されていません。ページにはinfo理由を説明せず、lslsリンクが指すファイル名ではなく、リンク自体の名前はまだ印刷されています」とのみ表示されます。私はこれが意図的な選択だと思いますが、この行動の根拠を知っている人はいますかls -L

答え1

リンクのもう一方の端にあるファイル名は、あなたが使用しているものではないかもしれませんls

リンク自体の名前の代わりにシンボリックリンク先の名前を表示するには、2つの問題があります。

  1. ファイルが存在しません。ディレクトリリストにシンボリックリンクのターゲット名が表示されている場合は、そのディレクトリ内のファイル名と考えることができますが、そうではありません。ターゲットの名前は、そのディレクトリにあるファイルにアクセスするために使用する名前ではありません。そのファイル名を持つファイルが(そのディレクトリに)存在しないか、最悪の場合は、その名前でアクセスするときに完全に異なる可能性があります。ファイル(またはディレクトリなど)。

  2. ファイル名が同じと思われる場合があります。シンボリックリンクのターゲット名が表示されている場合は、そのディレクトリの他のファイル名と同じであることがわかりますが、Unixシステムでは不可能です。

lsそのような場合、リストを検証するために使用する必要がないユーザーに混乱を招き、その-Lオプションが意味をなさなくなります-L

これ(いいえターゲット名の表示)もPOSIXで指定された動作であり、非常に明確です。

すべてのシンボリックリンク(コマンドラインで名前が付けられているかファイル階層で見つかったか)のファイル情報とファイルタイプを評価し、リンク自体ではなくリンクが参照するファイルのシンボリックリンクになるようにします。ただし、lsリンクが参照するファイルではなく、リンク自体の名前を記入する必要があります。-Lと一緒に使用すると、-lシンボリックリンクの内容を長い形式で作成します(STDOUTセクションを参照)。

これは、根拠セクションでこれ以上議論されない。POSIXlsマニュアル

答え2

-Lまたは、オプションを使用してもシンボリックリンクが表示され続けるのは、リンクされたファイルの名前ではなくリンクの名前によるものです-H

シンボリックリンクとハードリンクの間の注目すべき違いの1つは、シンボリックリンクの権限がとしてリストされている場合はほとんど使用されずls -l(最初の文字を除くs)、ファイル名はリンク名とパス名を表示する規則を使用することです。接続symlink -> target。この動作の理論的根拠は、ターゲットがls -l存在するかどうかにかかわらず、コマンドが機能することです。その目的は、シンボリックリンク自体に関する情報を提供することです。

この-Lオプションは、ハードリンクで発生するのと同様の動作を可能にするために追加されました。ファイル権限は実際の権限、つまりデフォルトのinodeの権限であり、ファイル名は照会される権限以外のものではありません。たとえば、実行してls -lL a*anで始まらないファイル名を表示すると、混乱する可能性があります。aまた、ターゲットリンクがない場合、デフォルトの inode がないため、権限が表示されず、コマンドはls -lLエラーで失敗します。

これが行われるもう一つの良い理由は、シンボリックリンクは通常、個々のファイル名ではなく相対パスまたは絶対パスに関連付けられていますが、相対パスまたはフルパスを表示する目的は提供されず、通常のファイルls -l名またはドットスラッシュなしでのみ提供されることです。 。

関連情報