【RHEL】シェル操作を劇的に効率化するブレース展開を解説

業務効率化

今回は、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環境でのシェル操作を大幅に効率化できる強力なツールです。基本的な使い方から応用テクニックまで理解することで、コマンドラインでの作業時間を短縮し、ミスを減らすことができます。

今回紹介したブレース展開のテクニックを日常の作業に取り入れることで、インフラエンジニアとしての生産性が向上することでしょう。特に大量のファイルやディレクトリを扱う場面や、パターン化された操作を行う際には、ブレース展開の威力を実感できるはずです。

効率的なコマンドライン操作は、エンジニアにとって重要なスキルの一つです。ブレース展開をマスターして、よりスマートなシェル操作を身につけましょう。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

業務効率化RHEL
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。

得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。

このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。

StarTellerをフォローする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました