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


30

ディレクトリにシンボリックリンクすることで、異なる結果に与えるls -lIかどうかに応じてln -s dirln -s dir/。しかし、実際の違いは何ですか、なぜ私はどちらを好むべきですか?

回答:


9

違いはありません。(ターゲットが既存のディレクトリではない場合、違いがあります。)

最後のスラッシュは、シェルの完了のためにそこに終わった可能性があります:いくつかの構成で、にln -s tarTabSpacelink完了しln -s target/ linkます。


リンクされた質問は、パス内の複数の連続したスラッシュに関するもののようですが、リンク上の末尾のスラッシュに関するものではありません。ここで言うことがあるかどうかはわかりません。
mwfearnley

実際、私はそれを言ってはいけません。質問に密接に関連している共通の懸念について、言うことはかなりあります。しかし、それがこの結論に至るとは思わない。
mwfearnley

@mwfearnleyそれは論理的な結果です:if foo -> bar/then はとfoo/qux同等bar//quxです。正式に言えば、質問のタイトルにはが含まれていませんがfoo -> bar/、そこでの回答でそのケースについても説明します。
ジル 'SO-悪であるのをやめる'

こんにちは、応答していただきありがとうございます。シンボリックリンクを含むパスが同等であることを教えてくれます。シンボリックリンク自体にアクセスする場合(末尾のスラッシュなしで)何が起こるかは必ずしもわかりません。また、Unixの専門家でなくても、「同等」が何を意味するのか、または意味しないのかは必ずしもわかりません。
mwfearnley

違いを生むエッジケースが少なくとも1つあるため、この答えに賛成票を投じなければなりませんでした。
フリム

27

私が考えることができる唯一のことは、ディレクトリを削除してファイルを作成する誰かからあなたを「保護する」ということです。

[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]$

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


3

興味深い質問。私は小さなテストを行いました:

$ 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の場合)、トレースは非常に似ています。ただし、これは単なるダンプテストであり、確信はありません。いくつかの違いがあるかもしれません。


それが実際に違いを生むかどうかも疑問に思っいますが、なぜ追加のスラッシュが保存されるのでしょうか?
トビアスキンツラー

2

あなたの質問は、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のようにそれをしていることに驚いた。

そして、なぜ私はどちらを好むべきですか?

特定のディレクトリ名が実際のディレクトリであるか、ディレクトリへのシンボリックリンクであるかを心配する場合は、末尾にスラッシュを付けないでください。

ディレクトリ自体ではなく、ディレクトリ内のファイルに関心がある場合は、末尾にスラッシュを付けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.