Bash展開について
皆様初めまして。技術部の中野と申します。
私は2016年の夏終わりに中途の未経験で入社しました。
以前はホテルのフロントという全くの畑違いのところで働いていたのですが、大学生の頃に自宅サーバを立ち上げていた経験があり、せっかくなら興味のある分野を突き詰めてみようかとネットアシストの門を叩きました。まだまだ経験の少ない素人ゆえ皆さんのような立派な記事を書くことはできないので、今回はbash展開について備忘録代わりに書き残し、お茶を濁させていただきたいと思います。
まず初めにBash展開とは何か…と簡単に説明できればよいのですが、まだまだ未熟な技術力しか持ち合わせていませんゆえ、うまく説明することができません。ですのでこれから例を挙げて、実際にどのような場面で活用することができるのか説明をしていきたいと思います。
では早速適当なディレクトリに移動して、bash展開を用いたコマンドを実行してみます。
# touch {1,2,3}
touchとは本来、ある特定のファイルのタイムスタンプを更新する際に用いるコマンドなのですが、その特定のファイルが存在しなかった場合、その名前で新規の空ファイルを作ってくれるという機能を持っています。そして{}で括られている部分がまさにbash展開の基本的書式になるのですが、百聞は一見にしかず、実行結果を見てみることにします。
# ll -rw-r--r-- 1 root root 0 11月 3 22:55 2016 1 -rw-r--r-- 1 root root 0 11月 3 22:55 2016 2 -rw-r--r-- 1 root root 0 11月 3 22:55 2016 3
この一回のコマンド操作だけで3つのファイルが出来上がっています。そして{}の中身はこのように変えることもできます。
# touch {5..9}
# ll -rw-r--r-- 1 root root 0 11月 3 22:55 2016 1 -rw-r--r-- 1 root root 0 11月 3 22:55 2016 2 -rw-r--r-- 1 root root 0 11月 3 22:55 2016 3 -rw-r--r-- 1 root root 0 11月 3 22:59 2016 5 -rw-r--r-- 1 root root 0 11月 3 22:59 2016 6 -rw-r--r-- 1 root root 0 11月 3 22:59 2016 7 -rw-r--r-- 1 root root 0 11月 3 22:59 2016 8 -rw-r--r-- 1 root root 0 11月 3 22:59 2016 9
これは”{}”内を始まりと終わりという形で指定したものです。”{”X”..”X”}”という形で、”..”を間に挟むことで複数ファイルの同時指定も可能になります。
つまり”{}”の使い方次第で、作業量を一気に効率化することができるのです。では実際、このbash展開がどのような場面で用いることができるのか実際の例と共にご紹介したいと思います。
- テストファイルを作るとき
つい先日、研修の一環としてrsyncとlsyncについて学びました。それぞれがどういう機能なのかという事は本題からそれますので省きますが、ざっくり言うと、異なる場所同士のファイルの同期を行ってくれるものです。そのテストを行う際、複数のテストファイルを作成するためにbash展開を用いました。ちょうど最初に示した例のような感じです。動作確認をするため、複数のファイルを作ったり消したりと何度も繰り返していたのでとても便利に使わせてもらいました。
- 設定ファイルのバックアップを取るとき
サーバと一言で言えど、多様な役割を持っています。Webページを閲覧する、ファイルのやり取りを行う、ネットワークの制御をする…そして、その全てに重要な役割を果たしているのが設定ファイルです。デフォルトのままで動作するものもなくはないのですが、それぞれの環境に合わせたチューニングが必須のものとなっています。そのチューニングの最中、思い通りの動作にならず切り戻しの必要が発生した時に、このバックアップが重要な役割を果たします。
例えばWEBページを公開するときに用いられるapacheの設定ファイルをバックアップするときには以下のコマンドを実行します。
# cp -ip /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig
長いです。”~.conf”までは全く同じ内容にもかかわらず、二回も記述をしています。そこでbash展開の出番です。”{}”を用いると以下のように書き換えることができます。
# cp -ip /etc/httpd/conf/httpd.conf{,.orig}
一番初めにtouchで1,2,3というファイルを作った時の応用です。コピー元として”,”の前にファイル名を指定し、”,”の後にバックアップファイル名を指定しています。ちなみに、このbash展開を利用できるのは末尾に限った話ではありません。以下のように中間に挿入することも可能です。
# cp -ip httpd{,.orig}.conf
また、下記の記述とすることで今日の日付を挿入する形でコピーすることも可能です
# cp -ip httpd.conf{,.`date +%Y%m%d`}
いかがでしたでしょうか?この方法を聞いたとき、まさに目から鱗が落ちてしまい、今までの自分の苦労に失笑せざるを得ませんでした。これからも様々な裏ワザ的方法を学んでいくと思うので、次の機会にはまた違うことを紹介できるよう努力したいと思います。