ディレクトリへのシンボリックリンクの末尾のスラッシュ


8

UNIXライクなシステムでパス解決のプロセス(manページpath_resolutionを参照)をエミュレートしようとしています。

私のOSはLinuxで、GNU coreutils 8.7を使用しています。

解決における余分な末尾の「/」の意味を明確にするために、シェルで次のことを行いました。

mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link

this_is_linkはシンボリックリンクであるため、すべて正常で、削除しました。しかし、試みている間:

mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link/

反響した rm: cannot remove 'this_is_link/': Is a directory

さて、末尾の「/」はシンボリックリンクのフォローを引き起こしたと私は思いました。だから、私は別のコマンドを試しました:rmdir this_is_link/

そして面白い結果が出ました: rmdir: failed to remove 'this_is_link/': Not a directory

私が期待したものではありません。だから私は私の友人に彼のシステムで同じ結果が得られるかどうか確認するように頼んだ。彼は私よりも低いバージョンのcoreutilsを持っていました。結果は驚くべきものでしたrmrmdir 'this_is_link/'Not a directory同じエラーが発生するかどうかは関係ありません

そして、別の友人が彼のMac OSで試したところ、結果は次のようになります。rm=> 'Is a directory'、rmdir=>ディレクトリは正常に削除され、リンクは残りました

パス解決の正確な動作に関する仕様はありますか?


回答:


7

POSIX /シングルUnixの仕様末尾にスラッシュとパス名がディレクトリを参照する必要があることを指定します(参照ベースの定義§4.11パス名の解決を)。foo/実際には、と同等であると定義されていますfoo/.(ファイル名を操作するときではなく、パス解決の目的で、末尾のスラッシュbasenamedirname無視します)。ほとんどの実装はこれを尊重しますが、いくつかの例外があります。

これは、の動作を説明します。これは、引数が明らかにディレクトリであるrm this_is_link/と同等rm this_is_link/.です。

rmdir this_is_link/同様にディレクトリを参照する必要があります。それがあなたのマシンにないのは、GNU coreutilsのバグです。OSXはここで正しく動作しています。


これはまさに私が必要としたものです、ありがとう!
ymfoi 2012年

-1

私の見解:

  • '' rm link / ''は、rmが最後の文字を見て、スラッシュであることを確認し、見た(実際には正しくない)診断を提供するため、失敗します。
  • '' rmdir link / ''は失敗しました:リンクはディレクトリではなく、シンボリックリンクです
  • '' rm link ''は正しく成功します

ちなみに、パスの解決はこれとはほとんど関係がなく、(正しく)引数に対して「stat」を呼び出す(これはrmdirが行っている)のではなく、「rm」が角を切り取っているように見えます。

乾杯。


1
実際、逆は真実のようです:rmstat(まあ、newfstatat、実際にはAT_SYMLINK_NOFOLLOWオプション付き)を呼び出し、それ以上続行することを拒否しますが、rmdirは実際にはrmdir(2)を呼び出しますが、を取得しENOTDIRます。
Ansgar Esztermann 2012年

@AnsgarEsztermann AT_SYMLINK_NOFOLLOWはシンボリックリンクをたどらないようにするため、状況に一致しない「ディレクトリではない」と出力する代わりに、rmはリンク自体を削除する必要があります。
ymfoi 2012年

stat(1)による簡単なチェックから、末尾のスラッシュはオプションを上書きします。出力statstat -L引数は最後のスラッシュなしで指定されている場合にのみ異なります。
Ansgar Esztermann 2012年

@AnsgarEsztermannああ、なるほど... 異なる環境に対する異なる効果はどうですか?何か案は?
ymfoi 2012年

1
それは逆です:ymfoiのマシンでrmは、正しく動作していて、そうでrmdirはありません。末尾に/は、POSIX標準に従って、引数をディレクトリとして扱うように強制する必要があります。参照については、私の回答を参照してください
Gilles 'SO-悪をやめなさい' 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.