グローバルパターンマッチングで発生するパスで複数のスラッシュを切り捨てる動作

グローバルパターンマッチングで発生するパスで複数のスラッシュを切り捨てる動作

私の限られた研究によると、bashでは、グローバルパターンの背後にあるいくつかのスラッシュが次のように切り捨てられます。

echo ////[h]ome////user////Desktop////test////
# outputs ////home/user/Desktop/test/

echo ////home////user////Desktop////tes[t]////
# outputs ////home////user////Desktop////test/

この結論は正しいですか?この動作は定義されていますか?それではどこで?異なるシェル間で共有されますか?相関関係がありますか?

bashのマニュアルを読みましたが、これについて何も見つかりませんでした。何か落ちたかもしれません。私はこれらの記号の間に意味論的な違いがないことを知っています(前に二重スラッシュを除く)。この動作が意図的なものか目的があるのか​​はわかりません。

編集:説明された動作はUbuntuのデフォルトのbashで発生します。 Kornシェル(/usr/bin/sh)はスラッシュを切り捨てません。

編集2:明確にするために:

  • Linuxがマルチスラッシュを処理する方法を尋ねるものではありません。明らかに、二重スラッシュ例外を除く複数のスラッシュは意味論的な意味を持たず、切り捨てることができます。
  • 私はこの動作がシェルパイプラインのどれにどのような影響を与えるか尋ねません。もちろん、グローバル拡張が引数として渡される場合は、スラッシュが多いことを除いて、そうではありません。
  • 私はglobパターンがあるパスでなぜこれが起こるのか尋ねません。明らかに、glob拡張を処理するコードは何でもglobの後に続くスラッシュも切り捨てられます。
  • 具体的に尋ねるこの動作が定義されているかどうか、意図的に、または意図的に異なるシェル間で共有されます。

答え1

いくつかの調査結果:

  • 動作(追加スラッシュの削除)は次のとおりです。明らかに許可するPOSIX経由

    パス名の文字は、次のように明示的に一致する必要があります。1つ以上 パターンの文字

    私は私たちがこのテキストからそれが何であるかを推論することはできないと思います。必須

  • これを行うことができる唯一の他のシェルはfish次のとおりです。

    $ fish -c 'echo //hom?///stephane///.'
    /home/stephane/.
    

    csh、、、、、、、、、、、、、、、、これをしないでください。tcshdashksh93mkshyashzshboshrcesakanga

    実装をテストしていませんglob()

  • bash 1.13.1(実行できる最も初期のバージョン)はすでに次のように動作します。

  • ksh は sh に対する POSIX 仕様の基礎となるシェルであり、シェル bash はほとんどの機能を複製しますが動作はそうではありません。

  • Bashリファレンスマニュアルには次の内容が記載されています。ファイル名を一致させるときは、スラッシュ文字は常にパターンの明示的なスラッシュと一致する必要がありますが、他の一致コンテキストでは以下のように特殊パターン文字と一致させることができます。、これは重複を削除することを正当化しません/

これらすべては、これが意図しない実装思考であった可能性があることを示唆しています。 POSIXでは必要ありません。私が知っている限り、他のBourne / POSIXシリーズシェルはこれを行うことはできません。 IMO、生成されたファイル名がパターンと一致しない可能性があるため、これはお勧めできません(case例:構成中)。

これは、その動作に依存できないか、スクリプトでその動作を使用できないことを意味しますsh。スクリプトがそれに依存すると、bash将来の状況に対応できなくなる可能性があります。


¹ globがパターンと一致しないパス名を生成する他の理由がありますがfoo[a/b]bar*

関連情報