ディレクトリにシンボリックリンクすることで、異なる結果に与えるls -l
Iかどうかに応じてln -s dir
かln -s dir/
。しかし、実際の違いは何ですか、なぜ私はどちらを好むべきですか?
ディレクトリにシンボリックリンクすることで、異なる結果に与えるls -l
Iかどうかに応じてln -s dir
かln -s dir/
。しかし、実際の違いは何ですか、なぜ私はどちらを好むべきですか?
回答:
違いはありません。(ターゲットが既存のディレクトリではない場合、違いがあります。)
最後のスラッシュは、シェルの完了のためにそこに終わった可能性があります:いくつかの構成で、にln -s tar
TabSpacelink
完了しln -s target/ link
ます。
foo -> bar/
then はとfoo/qux
同等bar//qux
です。正式に言えば、質問のタイトルにはが含まれていませんがfoo -> bar/
、そこでの回答でそのケースについても説明します。
私が考えることができる唯一のことは、ディレクトリを削除してファイルを作成する誰かからあなたを「保護する」ということです。
[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]$
ターゲットがファイルに置き換えられると、スラッシュのあるバージョンが壊れます。
興味深い質問。私は小さなテストを行いました:
$ 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の場合)、トレースは非常に似ています。ただし、これは単なるダンプテストであり、確信はありません。いくつかの違いがあるかもしれません。
あなたの質問は、ls
プログラムの振る舞いに関するものです。
1)ls -l $dir
$ dirが実際にシンボリックリンクである場合、シンボリックリンクに関する情報を取得します。
2)ls -lL $dir
$ dirがディレクトリへのシンボリックリンクである場合、ターゲットディレクトリに関する情報を取得します。
3)実行するとls -l $dir/.
、強制的にシンボリックリンクがたどられ、ターゲットディレクトリに関する情報が提供されます。
4)使用する場合ls -l $dir/
、ls
使用されているバージョンに応じて、結果は#1と同じ場合も#3と同じ場合もあります。旧バージョンのSolarisで#1のようにそれを行っていたのに慣れていて、Linuxが#3のようにそれをしていることに驚いた。
そして、なぜ私はどちらを好むべきですか?
特定のディレクトリ名が実際のディレクトリであるか、ディレクトリへのシンボリックリンクであるかを心配する場合は、末尾にスラッシュを付けないでください。
ディレクトリ自体ではなく、ディレクトリ内のファイルに関心がある場合は、末尾にスラッシュを付けます。