Bashで設定ファイルを解析する方法:sourceコマンドの活用
プログラムの設定をコードから分離して管理することは非常に重要です。これにより、プログラミング経験のないユーザーでも、コードを変更することなく設定を調整できるようになります。コンパイル済みのバイナリ実行ファイルの場合、ソースファイルへのアクセス権があったとしても(オープンソースソフトウェアならアクセス可能です)、プログラマーのスキルが必要になるため、非プログラマーが設定を変更することは事実上不可能です。そのようなスキルを持つ人は少数派であり、ほとんどの人は学びたくもありません。
一方、Bashのようなシェル言語では、シェルスクリプトはバイナリ形式にコンパイルされないため、常にソースコードへアクセスできます。しかし、だからといって非プログラマーがシェルスクリプトの中身を直接書き換えるのは得策ではありません。熟練した開発者やシステム管理者でさえ、うっかりミスでエラーを引き起こしたり、さらに深刻な問題を招いたりすることがあるからです。
そこで、設定項目をメンテナンスしやすいテキストファイルに分けておけば、コードと設定を明確に分離でき、非プログラマーでもコードに意図しない変更を加える危険なく設定を編集できるようになります。コンパイル型言語で書かれた多くのプログラムがこの方式を採用しているのは、ユーザーが開発者であるとは限らないからです。同じ理由から、インタプリタ型のシェル言語でもこの方法を採るのは理にかなっています。
従来の方法
他の多くの言語と同様に、BashでもASCIIテキストの設定ファイルを読み込んで解析し、変数名を取得して、プログラムの実行に合わせて値を設定するコードを書くことができます。たとえば、設定ファイルは次のようになります。
var1=LinuxGeek46
var2=Opensource.com
プログラムはこのファイルを読み込み、各行を解析して、それぞれの変数に値を設定します。
sourceによる読み込み
Bashには、変数の解析と設定をはるかに簡単に行える「source(ソーシング)」という仕組みがあります。実行可能なシェルプログラムから外部ファイルをsourceすると、そのファイルの内容全体をシェルプログラムに組み込むことができます。ある意味、これはコンパイル型言語のinclude文が実行時にライブラリファイルを取り込むのに非常によく似ています。このファイルには、変数の代入を含むあらゆる種類のBashコードを記述できます。
説明するよりも実際に見てもらうほうが早いでしょう。
まず、~/binディレクトリを作成し(まだ存在しない場合)、カレントワーキングディレクトリ(PWD)として移動します。Linuxのファイルシステム階層標準(FHS)では、ユーザーが自分の実行ファイルを格納する場所として~/binが適切と定められています。
このディレクトリ内に新しいファイルを作成します。名前はmainとし、実行可能にします。
[dboth@david bin]$ touch main
[dboth@david bin]$ chmod +x main
[dboth@david bin]$
この実行ファイルに以下の内容を追加します。
#!/bin/bash
Name="LinuxGeek"
echo $Name
そして、このBashプログラムを実行します。
[dboth@david bin]$ ./main
LinuxGeek
[dboth@david bin]$
次に、新しいファイル~/bin/dataを作成します。このファイルは実行可能である必要はありません。以下の内容を記述してください。
# 読み込まれるコードと変数
echo "これはdataファイルから読み込まれたコードです。"
FirstName="David"
LastName="Both"
mainプログラムに3行追加して、次のようにします。
#!/bin/bash
Name="LinuxGeek"
echo $Name
source ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"
プログラムを再実行します。
[dboth@david bin]$ ./main
LinuxGeek
これはdataファイルから読み込まれたコードです。
First name: David
LastName: Both
[dboth@david bin]$
sourceについてもう1つ知っておくと便利な点があります。sourceコマンドの代わりに、ドット1つ(.)をショートカットとして使えるのです。mainファイルを修正して、sourceを.に置き換えてみましょう。
#!/bin/bash
Name="LinuxGeek"
echo $Name
. ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"
再度プログラムを実行すると、結果は前回とまったく同じになるはずです。
Bashの起動時に読み込まれる設定ファイル
Bashを使用するすべてのLinuxホスト——Bashはすべてのディストリビューションのデフォルトシェルなので、実質的にすべてのホストが該当します——には、sourceの優れた実例が組み込まれています。
Bashシェルが起動するたびに、使いやすい状態にするために環境を構成する必要があります。Bash環境の設定には、主に5つのファイルと1つのディレクトリが使われます。それぞれの主な役割は以下のとおりです。
/etc/profile: システム全体の環境変数とスタートアッププログラム/etc/bashrc: システム全体の関数とエイリアス/etc/profile.d/:vimやmcなどの各種コマンドラインツールを設定するシステム全体のスクリプトや、システム管理者が作成したカスタム設定スクリプトを格納するディレクトリ~/.bash_profile: ユーザー固有の環境変数とスタートアッププログラム~/.bashrc: ユーザー固有のエイリアスと関数~/.bash_logout: ログアウト時に実行されるユーザー固有のコマンド
これらのファイルを通じて実行順序を追跡し、ログインシェルとして初期化される場合と非ログインシェルとして初期化される場合で、どのような順序で処理されるのかを確認してみてください。筆者は自身のLinuxトレーニングシリーズ『Using and administering Linux: Zero to sysadmin』第1巻の第17章でこの検証を行っています。
ヒントを1つだけ。すべては~/.bashrcスクリプトから始まります。
まとめ
本記事では、sourceを使ってBashプログラムにコードや変数の代入を読み込む方法を紹介しました。設定ファイルから変数を解析するこの手法は、高速で簡単、しかも柔軟です。Bashのコードと変数の代入を分離できるため、非プログラマーでも安全に変数の値を設定できるようになります。
-
AirDroidでファイル転送する方法|PCとスマホ間のデータ移行を徹底解説
スマートフォンの急速な普及に伴い、PCとスマートフォンの間でファイルをやり取りするニーズは今や非常に高くなっています。しかし、実際にどのようにデータを転送すればよいのでしょうか。そんなときに役立つのが、AirDroidのようなファイル転送ツールです。 Part 1:AirDroidとは?ファイル転送の手順を解説 AirDroidは、PCとスマートフォンが同じIPネットワーク(同一ネットワーク環境)上にあれば、相互にファイルを共有できるファイル転送ソフトです。パソコンとスマートフォン間だけでなく、同じIPネットワークに接続されたすべてのデバイスとの間でファイルの送受信が可能です。 このソフトの最
-
Wi-Fiファイル転送アプリでAndroidとPC間のファイルをワイヤレス共有する方法
AndroidスマートフォンやタブレットとPCの間で、ネットワーク経由でファイルを共有できれば作業効率は格段にアップします。USBケーブルを使ったファイル転送も可能ですが、ワイヤレスで行うほうがはるかに手軽です。この記事では、その手順をわかりやすくご紹介します。必要な条件はただひとつ、両方のデバイスが同じネットワークに接続されていることだけです。 この機能を実現する方法はいくつかありますが、ここでは「Wi-Fi File Transfer」というアプリに絞って解説します。無料版でも十分便利に使えますが、5MB未満のファイルしか転送できないというサイズ制限があります。有料版にアップグレードすれ