解説

本システムは 7つのシェルスクリプトから構成されているが，それぞれは 2行から 8行までの短いものである．本システムは作成に取り掛かってから 2日程度で完成した．このシス
テムは実際の授業で使用しており，レポート整理の手間の軽減，紙資源の節約等に役立っている．また，受け取ったレポートは学生全員にも読めるようにしている（読めないようにすることも可能である）．良いレポートも悪いレポートも学生同士で見ることができるので，良い刺激になっているようである．学生がレポートをコピーして提出した場合，そのことは全学生にも直ちにあきらかになるため，かえってコピーは減少しているようである．

2 本システムの使用法
このシステムでレポートを受けとる場合は，以下のような手順を行なう．

1．教官が，課題名（電子メールの Subject) とレポート提出期限を指定して出題する（
図2) ．このときの課題名は， ＇ bin" 以外の，空白をはさまない英数字の列とする．

゜黒板
レポート

最小 2乗法で入カデータに直線を当てはめるプログラムを作成せよ．

期限6月 17日Subject:lsq1

図2: レポート課題出題例

2. 学生側でレポートを emacs 等で作成し，教官宛に電子メールで送る．このとき，電子メールの題目 (Subject)は，ポートの本文中に1.で教官が指定した課題名を使う（図 3) ．なお，レ「Subject:課題名」で始まる行が存在すると，動作が保証されないので学生に注意しておく．

九州工業大学・情報科学センター
広 報 第 6号 1
993.7‑58‑︒

問題

解説

Emacs (M‑xmail)

To:tyamanoSubject:lsq1‑textfollowthisline‑
学籍番号 92XXXXX
名前九州太郎
作成年月日 6月 16日
問題
最小 2乗法で入カデータに直線を当てはめるプログラムを作成せよrプログラムとその解説

programlsq1realx{50},y{50}…．入カデータ格納配列

end
考察
連立一次方程式を解く部分にガウス掃きだし法を利用できる．
この場合のプログラムは以下のようになる．

感想
入カデータと，あてはめた直線をグラフィクスで表示させたいr̀

図3: レポート例

3. レポート提出期限が来たら，教官はcd N/report/bin
recrepo 課題名を実行する．これによって，ファイル〜教官ユーザ名／ report／課題名／学生ユーザ名‑59‑

九州工業大学・情報科学センター
広 報 第 6号 1
993.7

解説

にその学生のレポートが格納される（図 4).
また，電子メールで図 5のようなレポート受けとり通知が，学生に送られる．

4.教官および学生がemacs 〜教官ユーザ名／report／課題名

tyamano%/report/bin/recr
epolsql︒等のコマンドを実行して提出されたレポートを確認する．

tyamano% ls‑
I /recr
epolsq1‑
rw
‑
r
‑
‑
r
‑
‑ 1tyamano
1593Jun160
9:
18x92
5xxyx‑
rw
‑
r
‑
‑
r
‑
‑ 1tyamano
1582Jun160
9:
18x
92
5xpyn
‑
rw
‑
r
‑
‑
r
‑
‑ 1tyamano
1756Jun1609:
18x925xuay

図4: レポート受け取りプログラムの実行

Message‑Id:〈920616074
3.
AA
08028@post.
isct.
kyut
ech.
ac.
jp〉
To:x925xxyx
Date:Tue,16Jun9
21
6:
4
3:
18+0900
repo
rtl
s
ql を受けとりました．
/home/tyamano/
repo
rt/
ls
q1/x925xxyxにありますので確認してください．

図 5: レポート受け取り通知メール

3

レポート自動受け取りシステムの構成

本システムは〜／report/bin の下に，受け取りシステムのシェルプログラムを格納している．受け取ったレポートは

九州工業大学・情報科学センター
広 報 第 6号 1
993.7

eport／課題名〜／r‑60‑の下に格納される．

︒

From:yanianouet
akas
hi〈tyamano〉

解説

課題レポートが格納されているファイル一覧を出力する．
主プログラムrp̲exlの下請けプログラム．
epo
rt/
課題名／提出者名
課題レポートを〜／rに格納し，受けとり通知を発行する．
rp̲ex3の下請けプログラム．
課題レポートが格納されているファイル名とそのレポートの提出者を組にして出力する．

r̀

レポートの受けとり通知を発行する．
(rp̲ex5の下請けプログラム．）: 本システムを構成する 7本のプログラムの概要
図 6

本システムは図 6のような 7本のシェルプログラムによって構成されている．
以下に各プログラムの詳細を述べる．

3.
1 recrepo
本 シ ス テ ム の 主 プ ロ グ ラ ム ． 第 1引 き 数 に 課 題 名 を 指 定 し て 利 用 す る ． 図 7に内容を示

rす．

#!/bin/shincmkdir $HOME/report/$1ls $HOME/Mail/inbox lsort ‑nlrp̲ex1 $1lrp̲ex3lrp̲ex5 $1

図7:recrepoinc はメールスプールに格納されている未読のメールを〜／Mail/inbox の下に格納す

る．このとき，個々のメールは別々のファイルとなり，そのファイル名は正の整数である．

mkdir $HOME/report/$1 はデイレクトリ〜／report/課題名‑61‑を作成する．もし既にこ九州工業大学・情報科学センター
広 報 第 6号 1993.7

解説のデイレクトリが存在していた場合は，その旨がメッセージとして示され，次のコマンドが実行される．

＄HOME はホームデイレクトリ（〜／ ）を表す環境変数である．

シェルプログラムの第一引き数（この場合は課題名）を表す．

$1'はこのls $HOME/Mail/inbox は‑;Mail/inbox に格納された電子メールのファイル一覧を出力する．このコマンドの右には，パイプを表す

ドがあるため，このコマンドの出力は，画面には表示されず，＇ l の右にあるコマンド

sort ‑
n" の入力となる．従って， ＇ ls $HOME/Mail/inbox I
sort ‑n"

この出力はパイプによって次の 'rp̲ex
1 $1lrp̲ex3lrp̲ex5 $1' に引き渡される．なお，パイプで結合されたコマンドのことを「フィルター」と呼ぶ．フィルターの列'rp̲ex
1$1lrp̲ex3lrp̲ex5 $1" には図 8のようなデータが流れる．

︒

は電子メールのファイル一覧を，昇順に並び変えて出力することを表す．

I亭声

過去に受けとった電子メールを格納しているファイル名一覧

課題レポートを格納しているファイル名一覧

課題レポートを格納しているファイル名とそのレポート提出者の組の一覧

ごョ

図8:recrepo内のフィルターの列を流れるデータ

3.
2 rp̲exl
パイプ（または標準入力）から電子メールを格納しているファイル名一覧を入力して，課題レポートを格納しているファイル名一覧を出力する．
する．

第一引き数に課題名を指定して使用

p̲exlの内容を示す．
図 9に r

第 2行から第 5行までのwhile readf; do;...;done
は，パイプ（または標準入力）から 1語読み込んでシェル変数 '$f' に格納し，九州工業大学・情報科学センター
広 報 第 6号 1
993
.7

‑62‑‑

＇do' から゜

解説"done" までの間のコマンドを実行することを，入力がある限り繰り返すことを表す．

#!/bin/sh
while read f
docat $HOME/Mail/inbox/$flrp̲ex2 $f$
1done

図9:rp
̲exlr

本プログラムの場合，イル名となる．

$f' に格納されるのは，電子メールが格納されたファイルのファ

第 4行の

cat $HOME/Mail/inbox/$fは，$f" で示された電子メールの内容を出力することを表す．この出力はパイプによって"rp̲ex2 $f $1" に引き渡される．

3.
3 rp̲ex2
パイプ（または標準入力）から電子メールの内容を入力して，そのメールが課題レポートである場合のみ，その電子メールを格納しているファイル名を出力する．

第一引き数に電子メールが格納されているファイル名，第二引き数に課題名を指定して使用する．図 10にrp
̲ex2の内容を示す．

r̀#!/bin/shawk'$1 /Subject:/ {if($2=="'$2'") print'"$1'" }'図10:rp̲ex2

このプログラムは awkを使用している．

第 2行の$1 ‑/Subject:/‑63‑

九州工業大学・情報科学センター
広 報 第 6号 1
993.7

解説は， awkのパターンであり，パイプ（または標準入力）から 1行ずつ読み込んで，その行の最初の語である $1' が 'Subject:" と一致した場合に，この式に続く活動部を実行することを表している．

同じ第 2行の{if($2=="'$2'") print "'$1'"}
は，awkのアクションであり，読み込んだ行の 2番目の語が第二引き数で与えられた課題名と一致した場合，第一引き数で与えられたファイル名を出力することを表している．

3.
4 rp̲ex3
パイプ（または標準入力）から課題レポートを格納しているファイル名の一覧を入力し。

て，課題レポートを格納しているファイル名と，そのレポート提出者の組の一覧を出力す1に rp̲ex3の内容を示す．
る．図 1#!/bin/sh
while readf
docat $HOME/Mail/inbox/$flrp̲ex4 $fdone︒

図1
1:rp
̲ex
3

第 3行の

cat $HOME/Mail/inbox/$f
は，課題レポートの内容を出力することを表す．この出力には，このレポート提出者の電子p̲ex4" に引き渡メールアドレス等の情報も含まれている．パイプを通じて，この出力は｀＇ rされる．

3.
5 rp̲ex4
パイプ（または標準入力）から課題レポートの内容を入力して，そのレポートが格納されているファイル名と， レポート提出者の電子メールアドレスを出力する．

第一引き数に課題レポートが格納されているファイル名を指定して使用する．図 12に 1、p̲ex4の内容を示す．

九州工業大学・情報科学センター
広 報 第 6号 1993
.7‑‑64‑

解説#!/bin/sh
awk'$1 ‑/Return‑Path:/ { print 11'$1'"1111 $2 }'図 12:rp̲ex4
このプログラムは awkを使用している．

第 2行のパターン$1 ‑/Return‑Path:/rは，パイプ（または標準入力）から課題レポートの内容を次々と入力し，レポート提出者の電子メールアドレス（ユーザ名）が記述してある行を見つけた場合に，この式に続く活動部を実行することを表している．なお，電子メールの送り主のアドレスは，で始まる行の 2番目の語である．

Return‑Path:"

同じく第 2行のアクション{ print "'$1'111111 $2}
は，第一引き数に与えられた，課題レポートが格納されているファイル名と，そのレポートの提出者のアドレスを出力することを表している．

3.
6 rp̲ex5
パイプ（または標準入力）から課題レポートを格納しているファイル名と，そのレポート提出者名（ユーザ名）の組の一覧を入力して，課題レポートを;report／課題名／提化者名

rに格納し，受けとり通知を電子メールで発行する．
ているファイル名を指定して使用する．

第一引き数に，課題レポートが格納され

図13に rp̲ex5の内容を示す．

第 2行の

while readf g
でシェル変数 '$f' に課題レポートが格納されたファイル名が，$g にそのレポート提出者のユーザ名が代入される．

第 4行の

echo $g‑65‑

九州工業大学・情報科学センター
広 報 第 6号 1
993.7

解説

は現在処理を行なっているレポートの提出者（のユーザ名）を表示する．

#!/bin/sh
while read f g
doecho $g
cat $HDME/Mail/inbox/$f >$HOME/report/$1/$g
rp̲ex6 $g $1
rm $HOME/Mail/inbox/$fdone

゜

図 1
3:rp
̲ex5
第 5行の

cat $HOME/Mail/inbox/$f >$HOME/report/$1/$g
は，現在メールボックス (‑/Mail/inbox) に格納されている課題レポートを，;report／課題名／提出者名︒にコピーする．第 6行 のrp̲ex6 $g $1
はレポート受けとり通知を電子メールで提出者に送る．第 7行のrm $HOME/Mail/inbox/$fはメールボックスに格納されている課題レポートを削除する．

3.
7 rp̲ex6
レポート受けとり通知を電子メ・ールで提出者に送る．第 1引き数に，レポート提出者アドレス，第 2引き数に課題名を与えて使用する．

図14に rp̲ex6の内容を示す．

九州工業大学・情報科学センター
広 報 第 6号 1
993
.7

‑66‑

解説#!/bin/shecho "report" $2"を受けとりました． ＂＞ ＄HOME/report/bin/mtmp
echo $HOME"/report/"$2"/"$1" にありますので確認してください． ＂＞＞ ＼$HOME/report/bin/mtmp
mail $1 <$HOME/report/bin/mtmp

図14:rp
̲ex
6
第 2行の

r

echo "report" $2"を受けとりました．
は，ファイル＂＞ ＄HOME/report/bin/mtmp〜／ report/bin/mtmp にreport 課題名を受けとりました．
を書き込む．

第 3行から 4行にかけてのecho $HOME"/report/"$2"/"$1" にありますので確認してください．

＂＞＞＼$HOME/report/bin/mtmp
は，先に作られたファイル〜／report/bin/mtmp の末尾に教官ホームデイレクトリ／ report／課題名／提出者名r̀にありますので確認してください
を加える．

第 5行の

mail $1 <$HOME/report/bin/mtmp
は 〜／ report/bin/mtmp に作成された受けとり通知の内容を， ＄1で示されるレポート提出者宛に電子メールで送付する．

4 おわりにシェルプログラムと awk を組み合わせることによって，短期間で，授業レポート受けとりシステムを作成することができた．

‑67‑

九州工業大学・情報科学センター
広 報 第 6号 1
993.7

解説

シェルプログラムや awkの他の応用として，授業吊席状況採取システム，学生演習状況調査システム，簡単な質問応答システム，簡単な CAIシステム，UNIXワークステーションの管理運営システム等が考えられる．

UNIXには，ファイルやテキストを操作したり，編集したりするコマンドが大量に備わっている．このため，たいていの作業は C 等のプログラミング言語でプログラムを作成する必要はなく，その機能をもったコマンドを探しだすか，またはいくつかのコマンドを，パイプ，リダイレクション，awkやちょっとしたシェルプログラムで組み合わせることによって行なうことがでぎる．

参考文献
[1]S.
G.コーチャン／ P.
H.ウッド署玄光男，荒実訳， UNIXSHELLプログラミング， HBJ
出版局， 1
988.

[2] A.V.エイホ， B.W.カーニハン， P.
J.ワインバーガー著足立高穂訳プログラミング言語

゜AWK, トッパン， 1
989.
[3]R.
S.テ ア 著 ， 矢 吹 道 郎 監 修 田 中 啓 介 ／ 千 種 康 民 ／ 野 間 泉 訳 UNIX基本ツール，マグロウヒル， 1
990[4] 村井純／井上尚司／砂原秀樹共著プロフェショナル UNJX,ASCII,1986︒

九州工業大学・情報科学センター
広 報 第 6号 1993.7‑68‑