パス内のすべての「/./」発生(重複する可能性がある)を「/」に置き換えることは「安全」ですか?

パス内のすべての「/./」発生(重複する可能性がある)を「/」に置き換えることは「安全」ですか?

/.//POSIX互換システムで元のパスと同じ宛先に接続することを保証する交換されたパス(重複する可能性があります)がありますか?

例:

#!/bin/bash

shopt -s extglob

some_command -- "${@//\/+(.\/)//}"

修正する:

コメントを考えると同じではないので、質問を更新します。

POSIX準拠システムが元のパスと同じ宛先に接続することを保証する方法/././で表示される(重複する可能性がある)、パスは置き換えられましたか?/./

答え1

残念ながら、「POSIX互換システム」は現実の世界ではやや曖昧です。 POSIXは、標準のさまざまな部分とサブセクションを通じて、コマンドセット、シェル、ファイルシステム、システムコール、スレッドインターフェイスなどの一部をカバーしています。多くのシステムはPOSIXと互換性がありますが、拡張機能があるか、POSIX標準部分が互換性がない、または拡張部分と共存します。

//場合によっては、一部のシステムでは文字列の先頭が特別に処理されることがあります。

残りの文字列は、POSIXシステムまたはPOSIX互換サブシステムとインターフェースするシステムで置き換えるか、同じでなければなりませ/././/.//また、ほとんどの場合、//文字列の先頭や複数の連続したスラッシュを除くすべての項目は、justに縮小できます/

しかし、いくつかのものはまだあなたを倒すことができます。シェルとFSは/foo//barこれらを同じように扱うことができますが、/foo/barファイルシステムの外側のファイルを指すWebサーバーのようなものは、URL側でファイルを同じように扱わないかもしれません。これは、URLからFSのファイルにマッピングするのが簡単に見えるかもしれませんが、ある標準と他の標準が素直に推測されるとおりに必ずしも正確にマッピングされない場所があるからです。 FSの前にある他のネットワーク層も同様の極端なケースを引き起こす可能性があります。

/foo//bar特に、私たちのチームは、私たちの設定で最初に同じバックエンドファイルをキャッシュしますが、2つの異なるキャッシュTTLを持つ2つの異なるキャッシュオブジェクトに使用されることを発見したときに静的ファイルを提供するApacheサーバーの問題を思い出しました。/foo/bar。より早くキャッ​​シュします。 Varnish 構成を正式な形式で再構築すると、この問題は解決されます。

答え2

存在するパス名の確認slashPOSIX 2018では、2文字で始まるパスの特別なケースについて説明します。

slashパス名が連続した2文字で始まる場合最初のコンポーネント2つ以上の先行文字は単一文字として扱われる必要がありますが、後続の先行slash文字は実装で定義された方法で解釈できます。slashslash

.次に、パスにaを定義します。

特殊ファイル名は、dot前のファイルで指定したディレクトリを参照する必要があります。

POSIX 互換システムでは、次のような結論を出すことができます。しなければならないすべてのオーバーラップの発生をパスの単一の/./オーバーラップに置き換えることができます。///./最初に始める以外は/./交換できません。

/././また、これらのシステムでは、オーバーラップを単一に置き換えると/./例外なく動作します。

関連情報