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


15

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

..一致のリストから削除されるのはなぜですか?私の知る限り、パターン .は一致しません..か?

回答:


14

下にスクロール

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

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

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

設定GLOBIGNORE=.除外いつでもとにかく自動的に除外されたファイルGLOBIGNOREに設定され、と等価であるので、shopt -s dotglobそれを除く外...さらにすべてのパターンから除外されています。


1
実際、スラッシュGLOBIGNOREのみのパターンを無視...、GLOBIGNOREがファイル名ではなくファイルパスをフィルタリングするだけであることに気付きました。GLOBIGNORE=.; echo .*は含まれ.ません..が、GLOBIGNORE=.; echo ./.*(またはecho /bin/.*)は含まれます!無視する.と、..あなたが必要とするように、すべてのグロブから、それが見えるshopt -s extglobGLOBIGNORE='?(*/)@(.|..)'
ステファンシャゼラス

1
実際には、いや、GLOBIGNORE='?(*/)@(.|..)'排除するために失敗するであろう...して.*/fooGLOBIGNORE='?(*/)@(.|..)?(/*)'以下のような塊を壊す./*...
ステファンChazelas

3

次の「パス名の展開」というタイトルのセクションからman bash

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.