今回は、Red Hat Enterprise Linux (RHEL) でのブレース展開(Brace Expansion)について詳しく解説します。日々のシェル操作を格段に効率化できるこの機能は、コマンドライン作業を頻繁に行うエンジニアにとって必須のスキルです。ブレース展開をマスターすることで、タイピング量を減らし、複雑なファイル操作も簡潔に実行できるようになります。
ブレース展開とは?
ブレース展開は Bash シェルの機能の一つで、波括弧({})内に記述したパターンを展開して複数のコマンドライン引数を生成します。これにより、似たようなパターンを持つ複数のファイルやディレクトリを簡潔に指定できます。
RHEL のデフォルトシェルである Bash では、この機能が標準で利用可能です。シェルスクリプトでの活用はもちろん、日常的なコマンドライン操作でも大きな威力を発揮します。
基本的な使い方
ブレース展開の基本形式は `{パターン1,パターン2,…}` です。以下に基本的な使用例を示します。
文字列リストの展開
もっとも単純な例として、カンマ区切りの値を波括弧で囲むと、それぞれの値が展開されます。
$ echo {apple,banana,cherry}
apple banana cherry
この機能を利用して、複数のディレクトリを一度に作成することもできます。
$ mkdir -p /tmp/{data,logs,config}
$ ls -ld /tmp/{data,logs,config}
drwxr-xr-x. 2 user group 4096 May 6 14:30 /tmp/data
drwxr-xr-x. 2 user group 4096 May 6 14:30 /tmp/logs
drwxr-xr-x. 2 user group 4096 May 6 14:30 /tmp/config
数値シーケンスの展開
連続した数値を簡単に生成したい場合は、`{開始..終了}` の形式を使います。
$ echo {1..5}
1 2 3 4 5
増分を指定することも可能です。
$ echo {1..10..2}
1 3 5 7 9
数値は降順にも指定できます。
$ echo {5..1}
5 4 3 2 1
アルファベットシーケンスの展開
数値だけでなく、アルファベットのシーケンスも生成できます。
$ echo {a..e}
a b c d e
$ echo {Z..V}
Z Y X W V
##
実践的なユースケース
理論だけでなく実践で使えてこそ価値があります。以下に、実務で役立つユースケースをいくつか紹介します。
バックアップファイルの作成
ファイルを編集する前にバックアップを取る際に便利です。
$ cp config.ini{,.bak}
# 上記は cp config.ini config.ini.bak と同じ
複数環境の設定ファイル管理
開発、ステージング、本番環境など複数の環境設定ファイルを扱う場合に有用です。
$ touch config.{dev,stage,prod}.ini
$ ls config.*
config.dev.ini config.prod.ini config.stage.ini
ログローテーション
日付付きのログファイルを操作する場合などに役立ちます。
$ ls -l access_log.2023-05-{01..07}
# 5月1日から7日までのログファイルを一覧表示
複数サーバーへのSSH接続
類似名のサーバー群に対して操作を行う場合に便利です。
$ for server in web-server-{1..5}; do ssh $server "uptime"; done
応用テクニック
基本を理解したら、次は応用テクニックを見ていきましょう。
ネストしたブレース展開
ブレース展開はネストさせることができます。これにより、より複雑なパターンを生成できます。
$ echo {a,b}{1,2}
a1 a2 b1 b2
これを活用して、複数のディレクトリ構造を一度に作成することも可能です。
$ mkdir -p /tmp/project/{src,docs}/{main,test}
$ find /tmp/project -type d | sort
/tmp/project
/tmp/project/docs
/tmp/project/docs/main
/tmp/project/docs/test
/tmp/project/src
/tmp/project/src/main
/tmp/project/src/test
プレフィックスとサフィックスの組み合わせ
ブレース展開の前後にテキストを追加することで、より具体的なパターンを作成できます。
$ echo log_{info,error,debug}.txt
log_info.txt log_error.txt log_debug.txt
複数のパターンを組み合わせる
数値シーケンスと文字列リストを組み合わせることも可能です。
$ echo file_{1..3}_{old,new}.txt
file_1_old.txt file_1_new.txt file_2_old.txt file_2_new.txt file_3_old.txt file_3_new.txt
パフォーマンスと制限事項
ブレース展開は非常に強力ですが、いくつかの制限があることを理解しておく必要があります。
変数展開との順序
ブレース展開はシェルの変数展開よりも先に行われます。そのため、変数を含むブレース展開には注意が必要です。
$ prefix="my"
$ echo ${prefix}{1,2} # 正しい:変数展開が先に評価される
my1 my2
$ echo $prefix{1,2} # 注意:これは prefix1 prefix2 ではなく、my1 my2 になる
my1 my2
展開の数に注意
大量の組み合わせを生成するブレース展開は、意図せずシステムに負荷をかける可能性があります。
$ echo {1..1000}{1..1000} # これは1,000,000の引数を生成しようとする!
このような極端なケースは避け、必要な分だけ展開するよう心がけましょう。
ワイルドカードとの違い
ブレース展開はファイルシステムを検索するわけではないため、ワイルドカード(`*`、`?`)とは動作が異なります。ブレース展開はパターンを静的に展開するだけです。
$ echo {file1,file2,file3} # これらのファイルが存在しなくても展開される
file1 file2 file3
$ echo file* # これはファイルシステム上に存在するfileで始まるファイルのみ表示
RHELでの特有の考慮事項
RHELでブレース展開を使用する際には、いくつかの特有の事項があります。
バージョンによる違い
RHEL 7、8、9など、バージョンによってデフォルトのBashバージョンが異なり、一部の高度なブレース展開機能に違いがある場合があります。現在どのバージョンを使用しているかは以下で確認できます。
$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
SELinuxの考慮
RHELではSELinuxが有効な環境が多く、ブレース展開を使ってファイルを作成する際には、適切なSELinuxコンテキストが設定されているか確認することが重要です。
$ touch /var/www/html/test{1,2}.html
$ ls -Z /var/www/html/test*.html
-rw-r--r--. user group unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test1.html
-rw-r--r--. user group unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test2.html
##
効率化のベストプラクティス
ブレース展開を最大限に活用するためのベストプラクティスをご紹介します。
コマンド履歴を活用する
ブレース展開を含む複雑なコマンドは履歴に保存しておき、必要に応じて再利用すると良いでしょう。
$ history | grep "brace"
タブ補完で確認する
複雑なブレース展開を入力した後、Tabキーを押すと、シェルがどのように展開するかをプレビューできる場合があります(設定により異なります)。
aliasと組み合わせる
頻繁に使用するブレース展開パターンはaliasとして定義すると便利です。
$ alias mkenv='mkdir -p {dev,test,prod}/{config,data,logs}'
まとめ
ブレース展開は、RHELを含むLinux環境でのシェル操作を大幅に効率化できる強力なツールです。基本的な使い方から応用テクニックまで理解することで、コマンドラインでの作業時間を短縮し、ミスを減らすことができます。
今回紹介したブレース展開のテクニックを日常の作業に取り入れることで、インフラエンジニアとしての生産性が向上することでしょう。特に大量のファイルやディレクトリを扱う場面や、パターン化された操作を行う際には、ブレース展開の威力を実感できるはずです。
効率的なコマンドライン操作は、エンジニアにとって重要なスキルの一つです。ブレース展開をマスターして、よりスマートなシェル操作を身につけましょう。
コメント