web-dev-qa-db-ja.com

GLOBIGNOREはどのように機能しますか?

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

なぜ..一致リストから削除しましたか?私の知る限り、パターン. 一致していません ..、そうですか?

15
Ernest A

下にスクロール

ファイル名.および..は、GLOBIGNOREが設定されていてnullでない場合は常に無視されます。

ほとんどの場合、.および..をディレクトリ内のファイルを表すものではないため、ワイルドカードの一致として含めることは望ましくありません。これらはディレクトリナビゲーションを機能させるためのハックです。実際、ドットファイルの起源は lsコマンドの初期バージョンのバグ です。著者は...をリストから除外するつもりでしたが、.で始まるすべてのファイルを誤って除外しました。したがって、ドットファイルはlsから隠されました。シェルはlsのようなドットファイルを非表示にすることでそれに続きました。ただし、これが行われた方法は再びハッキングでした。.で始まるファイルは、ドットがパターンで明示的に一致しない場合にのみ除外されます。したがって、パターン.*には...が含まれます。

既存のスクリプトとの互換性を維持するために、最近のシェルには...が含まれています(zshは例外です。zshは、他の多くの問題と同様に、問題はありませんが、後方互換性はありません)。ただし、GLOBIGNOREを設定すると、bash固有の機能が使用されます。これは、下位互換性に関心がないことを示しています。したがって、パターンマッチングは、すべてのパターンマッチから.および..を除外するように変更されます。

GLOBIGNORE=.を設定すると、GLOBIGNOREが設定されているときに常に自動的に除外されるファイルが除外されるため、shopt -s dotglobおよび.がさらに除外されることを除いて、..と同等です。すべてのパターンから。

man bashの「Pathname Expansion」というタイトルのセクションから:

ファイル名 ''。 ''および '' .. ''は、GLOBIGNONOREが設定されており、nullでない場合は常に無視されます。

3
John1024