Skip to content
Latchkey

globbingとは何か?ファイル名パターンの展開

globbingは、コマンドが実行される前に、shellが*.jsのようなwildcardパターンを実際の一致するファイル名のリストに展開することです。

rm *.tmpと書くと、rmではなくshellが、どのファイルが*.tmpに一致するかを判断し、パターンをそのリストに置き換えます。これがglobbingです。パターンに基づくファイル名の展開です。非常に便利ですが、特にパターンが何にも一致しないとき、CIで驚くべきエッジケースがあります。

globbingとは何か

globbingは、shellがwildcardパターンをファイル名のリストに変える方法です。コマンドが実行される前に起こるため、コマンドはパターンを見ることはなく、展開された一致のリストだけを見ます。

よくあるglobパターン

  • *は先頭のドットを除く任意の文字の並びに一致します。
  • ?は任意の1文字に一致します。
  • [abc]はセット内の1文字に一致します。
  • **はglobstarが有効なときにディレクトリをまたいで一致します。

一致なしの驚き

デフォルトでは、globが何にも一致しない場合、shellはリテラルパターンを変更せずに残します。したがって、一致するファイルがないrm *.tmp*.tmpをリテラル名としてrmに渡し、紛らわしいエラーを生じます。

globの動作を制御する

Bashのオプションがこれを変えます。nullglobは一致しないパターンを何もないものに展開し、failglobはそれをエラーにします。適切なオプションを選ぶことで、スクリプトでの驚くべき動作を避けられます。

CIにおけるglobbing

cp dist/*.js out/のようなステップは、JSファイルがbuildされていない場合、展開されていないパターンがそのまま渡されるため、予想外に失敗する可能性があります。nullglobでガードするか、まずファイルが存在することを確認することで、CIステップが堅牢になります。

マネージドrunnerでの予測可能なglob

Latchkeyのrunnerでは、パターンが正当に何にも一致しない可能性があるとき、ステップにshopt -s nullglobを設定すると、リテラルパターンで失敗するのではなく空の結果がきれいに処理されます。

重要なポイント

  • globbingは、コマンドが実行される前にshellがwildcardパターンをファイル名に展開することです。
  • 何も一致しない場合、デフォルトではリテラルパターンがそのまま渡されます。
  • nullglobfailglobのようなオプションは、CIで空の一致を安全または明示的にします。

関連ガイド