シェルはOSのカーネルの機能を利用するためのインタフェースだと述べました.
インタフェースであるからには, 何かと何かの繋ぎ役になっているわけです.
1つは何でしょうか?そう, OSのカーネルですよね. そしてもう1つはユーザコマンドです.
UNIXのターミナルエミュレータから入力されたコマンドはシェルが解釈(interpret)
をして, OSのカーネルに伝達し, その結果をターミナルエミュレータにレスポンスと
して出力するということをしています. このことから, シェルはコマンドインタプリタ
と呼ばれることもあります. シェルがあるからこそユーザはリダイレクト(標準入出力,
エラー出力の切替)やパイプ(コマンドの出力結果を別のコマンドの入力として渡す),
エイリアス(コマンドの別名定義)などが可能になるわけです.
また, シェルのもう1つの機能としてプログラミング機能があります. シェルで記述
されたプログラムコードをシェルスクリプトと呼びます. シェルスクリプトによって,
コマンドのバッチ処理(コマンドの連続処理)が可能になります. シェルスクリプトも
汎用プログラミング言語のように変数や関数(シェル変数やシェル関数)を定義する
ことができ, また分岐処理やループ処理を利用して構造化プログラミングが可能なので,
単なるコマンドの連続実行だけでなく, より複雑な処理も実現できます.
まとめると, シェルは以下の2つの機能があるということです.
ちなみに, WindowsにおけるUNIXのシェル機能に相当するプログラムとしては,
コマンドプロンプト(スタートアップメニュー >> すべてのプログラム >> アクセサリ)
があります. しかしながら, ユーザインタフェース機能(コマンドインタプリタ機能)は
UNIXのシェルと比較するとかなり劣ります(ただし, Windows 7以降ではユーザインタ
フェース機能を強化したWindows PowerShellが標準搭載されているようです).
#!/bin/sh
if [ $# -eq 0 ] #引数の個数チェック
then
echo "usage : freport filename" #引数なしの場合
else
if test -d $1 #ディレクトリファイル ?
then
echo "1 : Directory"
fi
if test -e $1 #ファイルが存在する ?
then
echo "2 : File exists"
else
echo "2 : File not exists"
fi
if test -f $1 #通常ファイル ?
then
echo "3 : Regular file"
fi
if test -r $1 #読み込み可能 ?
then
echo "4 : File is readable"
fi
if test -s $1 #ファイルサイズが0でない ?
then
echo "5 : File has a size greater than zero"
fi
if test -w $1 #書き込み可能 ?
then
echo "6 : File is writable"
fi
if test -x $1 #実行可能 ?
then
echo "7 : File is executable"
fi
fi
#!/bin/sh
for SRC in $@
do
EXE=`echo $SRC | sed -e "s/\..*//"`
cc -o $EXE $SRC
done
#!/bin/sh
case $1 in
*.txt | *.c) #テキストファイル or Cソースファイル
view $1
;;
*.log) #ログファイル
less $1
;;
*)
if [ -x $1 ]
then
od -t x2 $1 #実行可能ファイルならダンプ
else
ls -l $1 #リスト表示
fi
;;
esac
#!/bin/sh
while [ "$1" != "" ] #$1の引数が空でないならループ
do
echo $1
shift #引数リストをシフト
done
実は, UNIX(Linux)をツール(道具)として使いこなすとは, シェルを使いこなすことと言えます.
すなわち, 上記のシェルの2つの機能を習得していくことが, UNIXをツールとして習得していくことになるのです.
シェルにはいくつかの種類があります. 代表的なものを簡単に説明します.
どのUNIX / Linuxにも用意されているため, シェルスクリプトで最も利用されるシェル.
(汎用性の面で)プログラミング機能は高いが, インタフェース機能は弱い.
Linuxの標準シェルであり, shの機能強化版.
インタフェース機能, プログラミング機能ともに要求するユーザに利用される.
cshはBSD系UNIX用に開発されたシェル. tcshはcshの機能強化版.
インタフェース機能は優れているが, プログラミング(スクリプト)では, あまり利用されていない
(他のシェルとスクリプトの文法が異なるため. csh / tcsh の記述はC言語に類似している).