シェルは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言語に類似している).