bash拡張グローバル変数置換がバイトレベルで機能するのはなぜですか?

bash拡張グローバル変数置換がバイトレベルで機能するのはなぜですか?

Bash変数の置き換えとワイルドカードが機能すると思います。特徴解像度があってそれを見てびっくりしました。バイト評価。
私についてのすべてlocaleen_AU.UTF-8

一致するものがなく、パターンでゼロ対多数を許可する場合は、次のように置換が発生します。バイト後続の置換に表示されるレベルです。次に進むと思いました。特徴しかし、そうではありません...

たぶんこれは単なる奇妙なケースのパターンかもしれませんし、明確なものを見逃しているかもしれませんが、ここで何が起こっているのか疑問に思いますが、この特定のパターン以外の他の場所でもこの動作を期待できますか?

これはスクリプトです(最初は文字列を文字に分割しようとします)。
私は Character の最後のテストが次のように終わると予想しました。一つ前にはスペースがありますが、文字の3 UTF-8バイトのそれぞれの前にはスペースがあります。これは誤ったUTF-8出力を引き起こします。

shopt -s extglob
for str in  $'\t' "ab"  ळ ;do
    printf -- '%s' "${str//*($'\x01')/ }" |xxd
done

出力:

0000000: 2009                                      .
0000000: 2061 2062                                 a b
0000000: 20e0 20a4 20b3                            . . .

ベストアンサー1

あなたの質問に対する短い答えは、*(pattern-list)が与えられたパターンのゼロ以上の出現と一致することです。各入力バイト間にUnicode文字0001のインスタンスはありません。したがって、置換操作はこれらのゼロインスタンスのそれぞれを空白に置き換えます。

たぶんあなたはこれをしたいかもしれません:

$ for str in  $'\t' "ab"  ळ ; do  
    printf -- '%s' "${str//+($'\x01')/ }" |xxd
  done)
0000000: 09                                       .
0000000: 6162                                     ab
0000000: e0a4 b3                                  ...

しかし、より長い答えは、とにかくパス名はテキストではないということです。少なくとも(Unixファミリー)オペレーティングシステムについては十分ではありません。これは一連のバイトです。問題は、次の作業が簡単であることです。

$ LC_ALL=latin1
$ mkdir 'áñ' && cd 'áñ'
$ LC_ALL=ga_IE.iso885915@euro
$ mkdir '€25' && cd '€25'
$ LC_ALL=zh_TW
$ pwd
# ... what should the output be?  And what about the output of:
$ /bin/pwd

各ロケールには、他のロケールにない文字が含まれています。この問題は、次の事項に影響します。位置-rそして検索 - 正規表現また議論位置-r正規表現なので、文字クラスなどのサポートを含める必要がありますが、パス名内の文字の文字クラスを決定するためにどのロケールが使用されるのか、使用可能なロケールがあるのか​​はわかりません。すべてのパスを表します。

おすすめ記事