Bash 5ファイル名拡張子とnullglob

Bash 5ファイル名拡張子とnullglob

これbash-5.0 マニュアルセクション3.5.8では、以下を指定します。

単語の分離後、Bash は -f オプションが設定されていない場合、各単語で '*', '?'および「[」文字を検索します(組み込み設定を参照)。これらの文字のいずれかが発生すると、その単語はパターンとして扱われ、パターンと一致するファイル名のアルファベット順のリストに置き換えられます(パターンの一致を参照)。一致するファイル名がなく、シェルオプションnullglobが無効になっている場合、単語は変更されずに残ります。 nullglob オプションが設定されていて一致するものがない場合、その単語は削除されます。

しかし、私のシェルでは、nullglob次のような状況で有効にすると、ファイル名の拡張も開始されるようです。

$ echo ${BASH_VERSION}
5.0.0(1)-release
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}

$ echo "${FOO//\//\\\/}"
\/home\/smith

興味深いことに、古いbashバージョンを使用すると、他の動作が発生します。

$ echo ${BASH_VERSION}
4.3.30(1)-release
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
\/home\/smith
$ echo "${FOO//\//\\\/}"
\/home\/smith

質問

ファイル名拡張が発生するとは予想しません。echo ${FOO//\//\\\/}bash 5.0が何も印刷しない理由を説明できますか?

ベストアンサー1

実際、より多くの調査を経て、これが後で復元されたことが判明しました。v5.1-alpha

$ echo ${BASH_VERSION}
5.1.0(1)-alpha
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
\/home\/smith
$ echo "${FOO//\//\\\/}"
\/home\/smith

個人的に期待される点です。

これはまた、さまざまなケースを解決するようです(これを指摘したStéphaneに感謝します)。

$ echo ${BASH_VERSION}
5.1.0(1)-alpha
$ a='/\x' bash -O nullglob -c 'echo $a'
/\x

おすすめ記事