前回前々回は,Linux上でプログラミングをするときによく使うテキスト・エディタ「Emacs」と「vi」の基本操作法を説明しました。今回は,Linuxを操作するときに大きな役割を果たす「シェル」について説明します。シェルは,プログラマとシステムの“仲介役”です。シェル・スクリプトというプログラムを用意しておけば,複数のコマンドをバッチ処理することも可能です。

シェルの役割

 コマンドを使ってLinuxを操作しているとき,我々はシェルのお世話になっています。シェル(shell)は,ユーザーからのコマンド入力を受け付けて処理を実行するプログラムです。そのため,コマンド・インタープリタとも呼ばれます。

 大まかなシェルの仕事の流れは,次の通りです。

(1) プロンプトを表示してコマンド入力を受け付ける
(2) ユーザーから入力されたコマンドラインを受け取る
(3) コマンドラインを「コマンド」「引数」などに分解する
(4) ワイルドカードなどがあれば展開する
(5) コマンド・プログラムを検索し,引数を渡して実行する
(6) 実行したプログラムが終了するまで待機する
(7) プログラムが終了したら(1)に戻る

Linuxで面白いのは,シェルが選択可能ということです。シェルには様々な種類があり,好みに応じて使い分けることができます。どんなシェルがあるのかは,/etc/shellsファイルを開いてみるとわかります(図1)。

$ cat /etc/shells
# /etc/shells: valid login shells
/usr/bin/es
/usr/bin/rc
/usr/bin/esh
/usr/bin/ksh
/usr/bin/zsh
/bin/csh
/bin/zsh
/bin/bash
/usr/bin/tcsh
/usr/bin/screen
/bin/sh
/bin/dash
/bin/tcsh
/bin/ksh
/bin/rbash
/bin/false
図1●/etc/shellsの例

 シェルは大きく分けて,sh系(sh,ksh,bash,zsh)とcsh系(csh,tcsh)の2種類があります。多くのLinuxディストリビューションでは,bashというシェルが標準的に使われており,本連載で取り上げているUbuntu(Ubuntu 8.04 LTS 日本語ローカライズド)でも,bashがデフォルトのシェルになっています。シェルが異なると,制御構文や変数の扱い,内部コマンドなどが異なってきます。

シェル・スクリプトとは

 シェルがコマンドを実行する処理方法には2通りあります。

 一つはコマンドを入力するたびに処理が実行される「対話的な使い方」です。ユーザーがコマンドを入力すると,シェルはただちに処理を実行します。

 もう一つは,あらかじめコマンドをファイルに記述しておき,「バッチ処理」として実行する方法です。

 シェルは,記述されたコマンドを順に実行するだけではなく,条件分岐や繰り返しを使った制御構文も扱うことができます。つまり,簡単なスクリプト言語を内蔵しているのです。シェル上で実行できるスクリプト言語を「シェル・スクリプト」といいます。

 シェル・スクリプトはLinux上で広く使われています。ユーザーのバッチ処理や問題解決ツールとしてだけではなく,システム管理ツールやLinuxシステムの起動処理,サービス・プログラムの実行制御にもシェル・スクリプトは使われています。さらに,シェル・スクリプトで作られているLinuxコマンドもあります。例えば,groupsコマンドなどです。このようにシェル・スクリプトは,Linuxシステムに欠かせないものです。

 ですから,シェル・スクリプトに対する理解を深めることで,Linuxシステムの動作もより深く理解できるようになります。Linux起動時に処理されるシェル・スクリプトの例を挙げます。図2は,Linuxの起動に関するファイル「rc.local」の内容です。

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/lsb/init-functions

do_start() {
        if [ -x /etc/rc.local ]; then
                log_begin_msg "Running local boot scripts 
(/etc/rc.local)"
                /etc/rc.local
                log_end_msg $?
        fi
}

case "$1" in
    start)
        do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac
図2●シェル・スクリプトの例(/etc/init.d/rc.local)

 プログラミング経験がある方なら,なんとなく構文は理解できるかもしれません。制御構造については次回に解説します。おそらく次回の記事を読み終えるころには,このスクリプトの8割程度は理解できるようになっていることと思います。