ディレクトリへのシンボリックリンクに末尾のスラッシュ/を含める必要がありますか?

ディレクトリへのシンボリックリンクに末尾のスラッシュ/を含める必要がありますか?

ディレクトリへのシンボリックリンクは、Ils -lまたはによって異なる結果を生成します。しかし、実際の違いは何ですか?なぜどちらを好むべきですか?ln -s dirln -s dir/

答え1

私が考えることができる唯一のことは、スラッシュを追加すると、スラッシュのないリンクがまだ機能し、(ファイルの代わりに)他のオブジェクトを指すので、誰かが実際のディレクトリを削除してファイルに置き換えることからユーザーを「保護」することです。目次)。

[user@host linktest]$ mkdir test
[user@host linktest]$ ln -s test/ slash
[user@host linktest]$ ln -s test noslash
[user@host linktest]$ ls -l
total 4
lrwxrwxrwx 1 paul paul    4 Feb 21 21:00 noslash -> test
lrwxrwxrwx 1 paul paul    5 Feb 21 21:00 slash -> test/
drwxrwxr-x 2 paul paul 4096 Feb 21 20:59 test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: symbolic link to `test/'
[user@host linktest]$ rmdir test
[user@host linktest]$ file *slash
noslash: broken symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$ touch test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$

スラッシュバージョンは、ターゲットがファイルに置き換えられると中断されます。

答え2

他に何もない。(ターゲットが既存のディレクトリではない場合は異なります。)

シェルの完成により、最後のスラッシュがそこにある可能性があります。一部の構成ではln -s tarTabSpacelink完成がln -s target/ link

答え3

あなたの質問は実際にプログラムの動作に関するものですls

1)$ dirが実際にシンボリックリンクであることを行うと、ls -l $dirシンボリックリンクに関する情報が得られます。

2) これにより、ls -lL $dir$dir がディレクトリへのシンボリックリンクである場合、ターゲットディレクトリに関する情報を取得します。

3)これはls -l $dir/.シンボリックリンクを強制的に追跡し、ターゲットディレクトリに関する情報を提供します。

4)これにより、使用されているバージョンls -l $dir/によっては1番、3番などの結果が出ることがあります。ls私は#1のようなことをする以前のバージョンのSolarisと#3のようなことをするLinuxに慣れていたので、これは私を驚かせました。

どちらを選択する必要があり、その理由は何ですか?

指定されたディレクトリ名が実際のディレクトリであるか、ディレクトリへのシンボリックリンクであるかを心配している場合は、末尾のスラッシュは必要ありません。

ディレクトリ自体よりもディレクトリ内のファイルに興味がある場合は、後にスラッシュを使用してください。

答え4

興味深い質問です。私は少しテストを行いました。

$ mkdir dir
$ ln -s dir/ test_slash
$ ln -s dir test_noslash
$ ls -l
total 4
drwxr-xr-x 2 vrusinov vrusinov 4096 Feb 21 16:41 dir
lrwxrwxrwx 1 vrusinov vrusinov    3 Feb 21 16:41 test_noslash -> dir
lrwxrwxrwx 1 vrusinov vrusinov    4 Feb 21 16:41 test_slash -> dir/
$ strace ls test_slash 2> trace_slash
$ strace ls test_noslash 2> trace_noslash
$ wc -l trace_*
   79 trace_noslash
   79 trace_slash
$ diff -u trace_* | less

ご覧のとおり、システムコールの数(少なくともlsの場合)に違いはなく、トレースも非常に似ているようです。しかし、これは単なるダンプテストであるため、わかりません。若干の違いがある場合があります。

関連情報