web-dev-qa-db-ja.com

バッシュでは、ワイルドカード展開が正しいことが保証されていますか?

Bashでのワイルドカードの展開は、アルファベット順であることが保証されていますか? Mercurialリポジトリで受け入れられるように、大きなファイルを10 Mbのピースに分割する必要があります。

だから私は私が使うことができると考えていました:

split -b 10485760 Big.file BigFilePiece.

そして、代わりに:

cat BigFile | bigFileProcessor

私はそれをできた:

cat BigFilePiece.* | bigFileProcessor

その代わりに。

ただし、アスタリスク(別名ワイルドカード、別名*)の展開が常にアルファベット順であり、.aa.abよりも前に来ることが保証されている場所はありません(反対にタイムスタンプ順またはそのようなものです)。

また、私の計画に欠陥はありますか?ファイルを一緒にcatingするパフォーマンスコストはどのくらいですか?

54
Sled

はい、グロビング展開はアルファベット順です。

Bash manページから:

パス名拡張

Wordの分割後、-fオプションが設定されていない限り、bashは各Wordをスキャンして、*?、および[の文字を探します。これらの文字のいずれかが表示された場合、Wordはパターンと見なされ、パターンに一致するファイル名のアルファベット順に並べ替えられたリストに置き換えられます。

これは、bashの動作が文書化されているため、スクリプトでこれに依存できます。非常に長い間、他のBourne互換シェルにも当てはまります...ケースの折りたたみや英数字以外の文字に関するコーナーケースがあるかもしれません。

(結果のリストは、bashでほぼ "ASCII-betical"の順序になります---大文字と小文字が大文字と小文字で照合され、大文字と小文字は区別されませんが、同等の大文字の前に小文字が照合されます。すべて非アルファベット文字は、ASCIIで表示されるのと同じ順序で照合する必要があります。

他の人が指摘しているように、これは言語関連の環境設定によって混乱する可能性があります。一般的にはLANG、より具体的にはLC_COLLATEです。 envコマンドの下でglob展開の順序に依存するコマンドを実行して環境をクリアするか(-iまたは-uを適切に使用)、または結果をsortにパイプして堅牢なシーケンスを確保するのが最も安全です。

4
Jim Dennis

Glob展開はアルファベット順に並べ替えられますが、シェルの言語設定にも従います。

これを移植可能にする場合は、スクリプトでこれを「C」に設定してください。

3
adaptr