Bashのマニュアルページによると:
GLOBIGNORE
A colon-separated list of patterns defining the set of filenames
to be ignored by pathname expansion. If a filename matched by a
pathname expansion pattern also matches one of the patterns in
GLOBIGNORE, it is removed from the list of matches.
しかし実際には...
$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar
なぜ..
一致リストから削除しましたか?私の知る限り、パターン.
一致していません ..
、そうですか?
下にスクロール …
ファイル名
.
および..
は、GLOBIGNORE
が設定されていてnullでない場合は常に無視されます。
ほとんどの場合、.
および..
をディレクトリ内のファイルを表すものではないため、ワイルドカードの一致として含めることは望ましくありません。これらはディレクトリナビゲーションを機能させるためのハックです。実際、ドットファイルの起源は ls
コマンドの初期バージョンのバグ です。著者は.
と..
をリストから除外するつもりでしたが、.
で始まるすべてのファイルを誤って除外しました。したがって、ドットファイルはls
から隠されました。シェルはls
のようなドットファイルを非表示にすることでそれに続きました。ただし、これが行われた方法は再びハッキングでした。.
で始まるファイルは、ドットがパターンで明示的に一致しない場合にのみ除外されます。したがって、パターン.*
には.
と..
が含まれます。
既存のスクリプトとの互換性を維持するために、最近のシェルには.
と..
が含まれています(zshは例外です。zshは、他の多くの問題と同様に、問題はありませんが、後方互換性はありません)。ただし、GLOBIGNORE
を設定すると、bash固有の機能が使用されます。これは、下位互換性に関心がないことを示しています。したがって、パターンマッチングは、すべてのパターンマッチから.
および..
を除外するように変更されます。
GLOBIGNORE=.
を設定すると、GLOBIGNORE
が設定されているときに常に自動的に除外されるファイルが除外されるため、shopt -s dotglob
および.
がさらに除外されることを除いて、..
と同等です。すべてのパターンから。
man bash
の「Pathname Expansion」というタイトルのセクションから:
ファイル名 ''。 ''および '' .. ''は、GLOBIGNONOREが設定されており、nullでない場合は常に無視されます。