1、概要
Cシェルは、C言語スタイルの構文を備えたコマンドインタプリタである。
主なシェルの機能をほとんど含んでおり、それ以外に次のような拡張機能
を持っています。
・以前に実行したコマンドの履歴を保存しておくことができ、保存されたリ
ストを参照して、繰り返し実行させたり、一部を修正して再実行させたりす
ることができる。(ヒストリ機能)
・コマンド名あるいはコマンド形式に一つの名前を付けることができる。
(エイリアス機能)
2、スタートアッププロシジュア
・ $home/.login
ログイン時に呼び出されるファイル。
・$home/.cshrc
Cシェルが呼び出されるたびに実行されるファイル。
ログイン時には .cshrcが先に実行され、次に .loginが実行される。
3、ヒストリ機能
Cシェルは、ユーザが打ち込んだコマンドの履歴をバッファに保存し以前
打ち込んだコマンドを容易に再実行したり、引数を再利用することができる。
ヒストリのバッファはhistory変数で設定する。
例)% set history=20
ヒストリの保存はsavehist変数で設定する。
例)% set savehist=20
ヒストリ機能の使用法
指定ヒストリ番号のコマンドを実行
% !番号
現在よりn番目前に入力されたコマンドを実行
% !−n
前回のコマンドを再実行
% !!
コマンドの最初の文字列が一致する一番新しいコマンドを実行
% !文字列
指定された文字列をもつコマンドの中で、一番新しいコマンドを実行
% !?文字列?
4、エイリアス機能
キーボードから打ち込まれたコマンドを解釈する機能です。この機能は、
コマンドおよびコマンド列を一つの名前をつけることができます。
エイリアス機能を使用することによって、コマンドのキー入力を減少させ
ることができます。
エイリアス機能の使用法
% alias 作成コマンド名 コマンドライン
例)
% alias rm ‘rm −i’
% alias dir ‘ls −ls’
% alias h history
% alias CD ‘cd ¥!*;pwd’
エイリアス機能の解除
% unalias 作成コマンド名
例)
% unalias rm
% unalias dir
% unalias h
% unalias CD
5、Cシェルプロシジュア
あらかじめコマンドをファイルに記述しておいて、 Cシェルにそのコマンド
ファイルを実行させることができます。
Cシェルプロシジュアの使用法
csh [−f] コマンドファイル [引数1 引数2 ....]
−f:ホームディレクトリの .cshrcの実行をしない。
その他にオプションがあるが通常はほとんど使用しない。
コマンドファイルの記述は以下の変数、式及びコマンドからなります。
・通常変数
・ 特殊変数
・ 組み込みシェル変数
・ 式(演算子、比較)
・ ファイル表現式
・ 内部コマンド
・ UNIX通常コマンド
通常変数
$変数名
$変数名[配列添字]
特殊変数
$?変数名 変数がセットされている場合は1、されていない場合は0を表す
$#変数名 変数名の要素数を表す
$* argv変数の全ての要素を表す
$$ 現在のシェルのプロセスIDを表す
$< 標準入力からシェル変数の値を入力する
組み込みシェル変数
添付1を参照
全て参照時は先頭に$をつける
例) echo $cwd
式
演算子は以下のものがある
+,−,/,*,%,<<,>>,|,&,^
比較式は以下のものがある
==,!=,<=,>=,<,>,!,||,&&
ファイル表現式
−? ファイル名
?は以下の文字に置き換える
d:ディレクトリ
f:普通のファイル
r:読み取りアクセス
w:書き込みアクセス
x:実行権
e:ファイルの有無
o:所有権
z:ファイルサイズがゼロ
これらの表現式は、ファイルついての状態を調べ真であれば1、偽であれば0を表す
内部コマンド
内部コマンドのうち普段よく使うもののみを以下に説明します
set文
変数に文字列を代入する
set
set 変数名
set 変数名 = 文字列
set 変数名[配列添字]= 文字列
set 変数名 =(文字列 文字列 ....)
set 変数名 = `UNIXコマンド`
@文
変数に数値を代入する
@
@ 変数名 = 数値又は数値式
@ 変数名[配列添字] = 数値又は数値式
数値式:+=,*=,++,−−などC言語と同様に使用可能
if文
if(比較式)コマンド文
if(比較式)then
コマンド文リスト
else if(比較式)then
コマンド文リスト
else
コマンド文リスト
endif
while文
while(比較式)
コマンド文リスト
end
switch文
switch(文字列)
case 文字パターン1:
コマンド文リスト
breaksw
case 文字パターン2:
コマンド文リスト
breaksw
.
.
default
コマンド文リスト
breaksw
endsw
foreach文
文字列リストの先頭から順番に変数名へ文字列をセットし、コマンドリストを実行する
foreach 変数名 (文字列リスト)
コマンド文リスト
end
goto文
指定ラベルのある位置まで処理をとばします
label:
.
.
goto label
又は
goto label
.
.
label:
exit文
Cシェルを終了し、指定された値がある場合は戻り値として返します
exit
exit 数値
break文
このコマンドを囲む最も内側のループ文をぬける
continue文
このコマンドを囲む最も内側のループ文の実行を先頭から再開する
shift文
配列変数を左へシフトする。これにより配列変数[1]の内容は破棄される
shift 配列変数名
配列変数名の先頭に$はつけない
以上の内部コマンドの例を添付2に示す
UNIX通常コマンド
cd,echo,ls,pwd等のコマンドプロンプトから入力する
通常のUNIXコマンドの使用ができる
添付1
argv この変数には、 csh コマンド文の引き数が設定されま
す。位置パラメータは、この変数から取り出した値に置
き換えられます。例えば、 $1 は $argv[1] に置き換え
られます。
cdpath この変数は、 chdir コマンドでサブディレクトリを捜
すときに検索する代替ディレクトリのリストを表します。
cwd この変数には、現在のワーク・ディレクトリの絶対パス
名が設定されます。ユーザが cd を使用してディレクト
リを変更すると、この変数の値も変更されます。
echo この変数は、コマンド行オプションの -x によって設定
されます。この変数が設定されている場合には、組み込
みコマンドとその引き数が、実行の前にすべて標準出力
デバイスにエコーされます。組み込みコマンドは、コマ
ンドとファイル名の置換の前にエコーされます。これ
は、コマンドの置換とファイル名の置換が、後から選択
的に実行されるためです。非組み込みコマンドでは、エ
コーの前にすべての展開が行われます。
history この変数は、ユーザのコマンド・ヒストリ・バッファを
作成し、そのサイズを設定するために使用されます。こ
の変数が未設定の場合には、コマンドの履歴は記録され
ず、ヒストリ置換の機能は使用できません。 history
に非常に大きい値を設定すると、シェルのメモリがオー
バフローを起こすことがあります。 10 または 20 程度
の値が普通です。コマンドは、実行の可否に関係なく、
すべてコマンド・ヒストリ・バッファの中に記録されま
す。
home この変数にはユーザのホーム・ディレクトリの絶対パス
名が設定されています。この home 変数は HP-UX 環境
から初期化されます。ティルド (~) に対するファイル
名の展開は、この変数を参照して行われます。
ignoreeof この変数が設定されている場合、 csh は入力デバイス
(ターミナル) からの EOF (ファイルの終端) 文字を無
視します。通常、 csh は、ファイルの終端を検出した
場合 (コマンド行の先頭文字として CTRL-D が入力され
た場合) には終了します。一方、 ignoreeof を設定す
ると、誤って CTRL-D を入力しても実行中のシェルを終
了してしまうことがなくなります。 EOF 入力の無限
ループを防止するため、 EOF が 26回続けて入力される
と、csh は終了します。
mail この変数には、 csh がメールの有無を調べるファイル
のリストが設定されます。 csh は、定期的に (デフォ
ルトでは 10分ごとに)、コマンドの終了と次のプロンプ
トを表示する間に、この変数をチェックします。この変
数に指定されているファイルの中に、前回のチェック以
降に変更されたファイルがある (つまりそのファイルに
メールが保存された) 場合、 csh は You have new
mail とプリントします。
mail の値の最初のワードが数値であれば、その数値は
メールをチェックする時間間隔を秒単位で表したものと
解釈されます。
複数のメール・ファイルが指定されている場合、シェル
は New mail in file_name, とプリントします
(file_name はメールが格納されたファイル)。
noclobber この変数は、出力のリダイレクトに制限を加え、ファイ
ルが誤って破壊されるのを防ぎます。ファイルの後に追
加する形式のリダイレクト (>>) を使用するコマンドで
は、既存ファイルが対象となります。
noglob この変数が設定されている場合、ファイル名の展開は行
われません。これは、ファイル名を扱わないシェル・ス
クリプトや、取り出したファイル名のリストをそれ以上
展開したくないときに有用です。
nonomatch この変数が設定されている場合には、ファイル名の展開
で既存のファイルと一致しなくてもエラーになりませ
ん。一致するものがなければ、もとのパターンが戻され
ます。ただし、もとのパターンの形式が誤っていればエ
ラーになります。例えば、 'echo [' は、やはりエラー
になります。
notify この変数が設定されている場合、 csh は、バックグラ
ウンド・ジョブの完了を (標準出力デバイスを通して)
ただちに通知します。デフォルトは unset (未設定) で
す (プロンプトを出す直前にジョブの完了を通知します)。
path path 変数の各ワードによって、実行するコマンドを捜
すディレクトリが指定されます。空のワードは、ユーザ
の現在のワーク・ディレクトリを表します。 path 変数
がない場合は、コマンドの実行に絶対パス名の指定が必
要になります。 path が未設定で、ユーザが絶対パス名
を指定しない場合、 csh は、ディレクトリ . (現在の
ディレクトリ)、 /usr/bin. の順でコマンドを捜しま
す。 csh に対して -c と -t のいずれのオプションも
指定されていない場合には、通常、 .cshrc の読み取り
後と path 変数の再設定のたびに、 path 変数に設定さ
れたディレクトリの内容についてハッシュ値が計算され
ます。シェルの実行中に、これらのディレクトリに新し
いコマンドが追加された場合には、 rehash を実行して
csh からその新しいコマンドにアクセスできるようにす
る必要があります。
prompt この変数によって、独自のプロンプト文字列を指定でき
ます。プロンプトは、対話形式のターミナル入力からコ
マンドが読み取られる前に表示されます。この文字列の
中に ! があると、その前に \ を付けた場合を除いて、
コマンド・ヒストリ・バッファの現在のイベント番号に
置き換えられます。デフォルトのプロンプトは、一般
ユーザではパーセント記号 (%) 、スーパー・ユーザで
は # の文字です。
shell この変数には、 csh プログラムが格納されているファ
イルの名称が設定されています。実行ビットが設定され
ているのにシステムが実行できないファイルがある場
合、この変数を使用してシェルをフォークし、そのファ
イルの解釈を実行します。
status この変数には、直前のコマンドが戻したステータス値が
設定されます。コマンドが異常終了すると、status 変
数の値に 0200 が加算されます。異常終了した組み込み
コマンドは exit ステータス 1 を戻し、それ以外の場
合組み込みコマンドはステータス 0 を戻します。
time この変数には、コマンドの自動時間計測機能を制御する
数値が設定されます。この変数が設定されている場合に
は、指定された秒数を超える cpu 時間を消費したすべ
てのコマンドについて、 csh は、ユーザ時間, システ
ム時間, 実行の実時間, および利用率を示す1行の情報
をユーザの標準出力デバイスにプリントします。利用率
は、実時間に対する、ユーザ時間とシステム時間の合計
の割合を表します。このメッセージは、コマンドの実行
終了後にプリントされます。
verbose この変数は、コマンド行オプションの -v によって設定
されます。この変数を設定すると、各コマンドを構成す
るワードが、ヒストリ置換の実行後に標準出力デバイス
にプリントされます。
添付2
入力されたディレクトリの中からCとFORTRANのファイルをさがし、そのファイ
ル名とファイルの数を出力し、coreファイルがあれば会話形式で削除も行う
このシェルはディレクトリの入力のところで‘e’の文字が入力されるまで繰り返す
#
# sample Cshell program
while(1)
echo −n‘directory path > ’
set DNAME=$<
if($DNAME == ‘e’) exit 1
cd $DNAME
set LIST=`ls`
set CLIST=`ls *.c`
set FLIST=`ls *.f`
@ CNUM=0
@ FNUM=0
foreach FILE($LIST)
switch($FILE)
case ‘*.c’:
@ CNUM++
breaksw
case ‘*.f’:
@ FNUM++
breaksw
default:
if($FILE == ‘core’) then
echo ‘core remove? y or n’
if($< == ‘y’) goto delete
continue
delete:
rm −f $FILE
echo ‘core file removed.’
endif
breaksw
endsw
end
echo ‘number of C source=’$CNUM
@ CNT=1
while($CNUM >= $CNT)
echo −n $CLIST[$CNT]‘ ’
@ CNT++
end
echo ‘ ’
echo ‘number of FORTRAN source=’$FNUM
while(1)
echo −n $FLIST[1]‘ ’
shift FLIST
if($#FLIST == 0) break
end
echo ‘ ’
end