ソースコード・リテラシーのススメ

第19回 ソフトウェア・ツールズの活用

この記事を読むのに必要な時間:およそ 4 分

前回紹介したPlamo Linux 4.5は,無事10月16日に正式公開できました。これで開発も一段落,と言いたいところですが,すでにX11R7.4やPython-2.6など,重要なソフトウェアがバージョンアップされてしまったため,さっそくそれらに追従する作業を始めています。

ディストリビューションのまとめ役というのは因果な稼業で,リリース前にはテストのためにβ版を何度となくインストールする一方で,リリースが終わればさっそく新しいパッケージのビルドやテストで中身が入れ替ってしまい,苦労して作ったリリース版を自分で使っている時間はほとんど無かったりします(苦笑)。

このような作業の中でGNOMEやKDEの新版などをいじっていると,最近のGUIツールの充実には目を見張るものがあります。一般ユーザの作業だけでなく,システム管理レベルの作業の多くがGUI経由で行えるようになり,rootの概念もかってのUNIXの世界とはずいぶん変ってきたように感じます。

最近では1人が1台以上のマシンを利用するのがあたりまえなので,かつてのように「特別の権限をもったrootユーザ」という概念が時代遅れになるのはあたりまえという気もします。

GUIツールは初心者にも取っつきやすく,あらかじめ決められた定型的な作業をするには便利ですが,同じような作業を何度もくりかえしたり,想定外の作業をしようとすると途端に面倒になります。

筆者のようにディストリビューションのまとめ役という作業をやっていると,一般ユーザーには必要ない類いの作業が多数発生します。今回もX11R7.4への更新作業中に,7.4として配布されているパッケージだけではX Window Systemを動作させることができないことに気づき,7.3から7.4で更新されたパッケージとそうでないパッケージを調べる必要が生じました。

このような例外的な作業をGUIツールでサポートすることは困難ですし,かといって,全てのパッケージをひとつひとつ調べていくのも現実的ではありません。コンピュータを使いこんでいくと,この手の「専用ツールを用意するほどではないけれど,手作業で処理するのは大変」といった規模の作業によく出会います。このような作業に力を発揮するのがソフトウェア・ツールズ(software tools)です。

ソフトウェア・ツールズとは

以前にも簡単に紹介したことがありますがソフトウェア・ツールズとは,Linuxの元となったUNIXの世界で広く用いられていた概念で,何でもできる大きなソフトウェアではなく,ひとつの機能に特化した小さなソフトウェアを組み合わせて必要な機能を実現しようという考え方です。

UNIXが生まれたころのコンピュータは,現在とは比べものにならないほどCPUの能力もメモリの容量も貧弱で,メモリやCPUを大量に必要とする高機能で大きなソフトウェアよりも,一つの機能をうまくこなす小さなソフトウェアが好まれました。

開発者たちが必要に応じて作ったそれら小さなソフトウェアは,次第に取捨選択され,洗練を重ねて,UNIXの基本コマンドに成長しました。これらの基本コマンドを組み合わせて複雑な処理もやってしまおう,というのがソフトウェア・ツールズの考え方です。

ソフトウェア・ツールズは「大工さんの道具箱」のイメージがもっともふさわしいでしょう。大工さんがカナヅチやノコギリ,カンナといった単機能な道具を器用に組み合わせて大きな建物でも作りあげてしまうように,優れたプログラマはcutやsedといった単機能なコマンドを自在に組み合わせて複雑な作業をやってのけます。

ソフトウェア・ツールズとしてどのようなコマンドを多用するかは人それぞれですし,よく行う作業によって必要となるコマンド類も異なってくるでしょう。以下では筆者がよく使うコマンドとオプションを簡単に紹介します。

grep
引数として指定した文字列がファイルに含まれるかを検索するコマンド。どのソースコードのどこに指定した文字列があるかを調べることができる。指定した文字列を含まないファイルを表示したり(-v),文字列を含むファイル名だけを表示(-l)することも可能。
sed
ストリームエディタ。ファイルの中の文字列を別の文字列に置き替える際に利用。^ で行頭,$ で行末を意味する等の正規表現も指定可能。
cut
行の分割コマンド。-d オプションで区切り記号(デリミタ)を指定できる。区切り記号を空白文字(-d' ')にすれば英文を単語に分割できるし,コロン(-d':')にすればパスワードファイルをフィールドごとに分割できる。分割した行は -f オプションで指定した部分のみを取り出すことができる。
sort
ソート(並び替え)コマンド。ファイルや標準入力の内容を指定したキーの順番に並び替えて出力する。キーの区切り記号や位置はオプションで変更可能。
uniq
同じ内容の行が連続する際にそれらを1行にまとめるコマンド。同じ行が何度出てきたかを数えることも可能(-c)で,sortと組み合わせて特定の文字列の出現頻度を数える際などに便利。
find
指定したディレクトリ以下にあるファイル群から条件に合うファイルを見つけるコマンド。条件はファイル名やファイルの種類,更新日時,大きさなど,さまざまに指定可能。条件を指定せず,あるディレクトリ以下のすべてのファイルの名前を表示させるという使い方も可能。
xargs
標準入力から読み込んだ一群のファイルに対して同じ操作を繰り返し行う際に便利なコマンド。findと組み合わせて,あるディレクトリ以下のすべてのファイルに対してgrepを行う,といった際に利用。
basename
パス名(たとえば /home/kojima/myfile.txt)からファイル名(myfile.txt)を取り出したり,ファイル名から拡張子の部分(.txt)を取り除いたりするコマンド。ファイルの拡張子を一括変換する際などに便利。
gawk
これまでに紹介したコマンドよりはスクリプト言語に近いツール。行単位でのパターンマッチやアクション指定などの機能を持ち,sed や cut の仕事の多くを代用することも可能。後発のPerlやPythonに比べると制御構造等が弱いので,大規模なコードを書くには向かない。

これらUNIXの基本コマンドは基本的に1つの機能しか持ちませんが,標準入力からデータを読み込み,加工した結果を標準出力に出力するという共通したデザインで設計されているため,あるコマンドの結果をパイプ(|)で次のコマンドに読み込ませて処理を重ね合わせ,1つ1つのステップは単純でも,全体ではずいぶん複雑な処理ができるようになっています。

単機能なコマンドを組み合わせて必要な機能を生み出していくのはパズルを解くような知的作業で,GUIならばマウスを何度もクリック,クリックしないといけない作業を,コマンドライン一発でさっと処理した時は,思わずガッツポーズを取りたくなるほどです(笑)。

ソフトウェア・ツールズで難しいのは,これらUNIXの基本コマンドを使うかPerlやPythonといった本格的なスクリプト言語を使うかの見極めでしょう。数分で書ける書き捨てのコードは,これら基本コマンドを組み合わせたシェルスクリプトで書く方が楽ですが,同じような作業を将来も行う可能性がある場合は,多少時間をかけてもPythonくらいで書いておく方が後々まで使い回せて楽だったりします。今の楽さを取るか,将来,楽をするために今の苦労を取るかは,判断の難しいところです。

最近はPythonを勉強していることもあり,個人的には,ざっと考えてシェルスクリプトで10行以内に収まらないレベルの処理ならばPythonを使うことを考えます。でも,たいていは「こういう処理はPythonだとどう書くんだっけ?」というのを調べるのが手間なので,途中経過を中間ファイルにして,10行以下のシェルスクリプトを複数作る,といった方法でお茶を濁しがちのため,Pythonの勉強は全然進みません(苦笑)。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入