* 第4回 印刷とシェルスクリプト [#xa50848f]

** 目次 [#pf8747f0]

#contents

** 印刷(プリンタの設定) [#z690aa69]

*** ftpによるダウンロード [#i24f3144]

印刷の演習をする前に、印刷するファイルがないと困ります。そこで、みなさんが以前に作成したC言語のソースコードを、演習室のコンピュータからダウンロードしておきましょう。

ここで用いるftpはコンピュータ間でファイルを転送するために用いられるプログラムです。ftpの説明は以下のサイトやマニュアル(man ftp)を参照してください。
- http://nile.ulis.ac.jp/2kou/docs/ftp.html
- http://www.yk.rim.or.jp/~inukai/unix/ftp_usage.html

+ 演習室のマシン x1.educ.tamagawa.ac.jp に自分のアカウントを使って、ftpで接続してください.
 ftp x1.educ.tamagawa.ac.jp
+ 自分のホームディレクトリを見て下さい.
-- ディレクトリの一覧と移動は、それぞれ「ls」と「cd」で可能です。
+ 適当なファイルをサーバ(x1)に置いたり,取り寄せたりしてみてください。
-- ファイルの取得と送信は、それぞれ「get」と「put」で行えます。
+ その他、ftpのなかで「help」とタイプするとコマンド一覧がでます.
-- bye, ls, cd, mkdir, lcd, get, put, mget, mput のコマンドの使い方を覚えて下さい.
+ 演習室のマシンから、自分のC言語のプログラムをいくつかダウンロードしてください。
+ ここでダウンロードしたプログラムは、以下でテスト印刷に用います。このプログラムの冒頭に,''自分の名前がローマ字で,コメント文として入っているかどうか''を確認して下さい.名前が入っていなければ書き込んで下さい.

【おまけ】 telnetの使い方:昨年の実験では、Mac OSでtelnetを利用したでしょうが、同じようにLinuxでもtelnetが利用できます。たとえば、大学のサーバに接続するには以下のようにします。
 telnet x1.educ.tamagawa.ac.jp

*** PostScript [#hc5af468]

演習室のプリンタはPostScript(PS)というプリンタ言語で書かれたファイルを印刷します.そこで,テキストファイルをPSファイルに変換する必要があります。

そのひとつがa2ps.pl (これの意味はASCIIからPSへ変換する - A to PS - の意味です)といプログラムです。この課題では、まずa2ps.plを使ってテキストファイルをPSに変換します。

+ 「a2ps.pl」で検索し、ソフトウェアを入手します。
-- 自分のマシンの適当なディレクトリにファイルを保存してください。
+ a2ps.plをインストールします。
-- インストール方法は、「a2ps.pl インストール」で調べるとよいでしょう。
-- 必要ならば、a2ps.plの1行目を説明の通りに書きかえます。
-- 必要ならば、chmodコマンドでファイルに実行許可を与えます。
+ 先ほどダウンロードしたC言語のソースファイル(例:prog1.c)を、PSファイル(prog1.ps)に変換してみましょう。下記は例です。インストールの仕方によってコマンドは異なります。
 ./a2ps.pl prog1.c > prog1.ps
-- 上記コマンドの意味がちゃんと理解できますか?
+ できあがったPSファイルを画面で確認してください。
 gv prog1.ps
- ちなみに、PSファイルの中身の記述がどんなものかは、そのまま表示させてみれば分かります。たとえば以下のようにします。
 more prog1.ps

*** プリンタの設定 [#o99d40d2]

演習室には沖データのPostScriptプリンタが設置されています.このIPアドレスは,
 192.168.61.10
です.このプリンタでファイルが印刷できるように設定します。

+ 作業はスーパーユーザで行います。
+ pingコマンドで,このプリンタから応答があることを確認してください.
 ping 192.168.61.10
+ 沖データのサイトには詳細な設定の方法が書いてあります.以下のリンク先のA)を参考にして,プリンタの設定をして下さい.
-- http://www.okidata.co.jp/support/unix/4_install.html#a08
-- ただし,この説明のままではなく、以下の変更が必要です。
-- /usr/spool というのを全部 /var/spool に書き替えてください。
-- (1) の printcap ファイルは次のようします。
 lp:\
     :rm=192.168.61.10:\
     :sd=/var/spool/lpd/microline:\
     :lf=/var/spool/lpd/microline/errors:
-- (4), (5) のディレクトリ名は
 /var/spool/lpd/microline/
としてください.
+ /etc/printcapの設定が済んだら,次のコマンドでlpdを再起動し、設定を有効化してください。
 /etc/rc.d/init.d/lpd restart
+ 最後に、一般ユーザに戻って下さい。

*** 印刷のテスト [#wea38943]

+ 以上の設定が終わったら、先ほど作ったPSファイルをテスト印刷してみましょう.印刷には、lprというコマンドを用います。
 lpr ファイル名.ps
+ 印刷状況はlpqというコマンドで確認できます.印刷を取り消すにはlprmというコマンドを使います.
+ 沖データのサイトの説明が間違っていたりするので、たぶん一回ではうまく印刷で
きないと思います./etc/printcapの設定などを見直してください.
-- インターネット上にあるprintcapの設定方法情報なども役に立つと思います.
+ うまく印刷できたら,''印刷できた紙に手書きで、番号と漢字の名前を書き加えて、教員に提出してください。''

*** 印刷の仕組み [#da034497]

みなさんのマシンでは,プリンタと交信して印刷をつかさどるlpdというプログラムが常時動いています.
 ps -aux | grep lpd
とタイプしてみて下さい.動いていることが確認できましたか? man lpdとすると説明が読めます.印刷するにはlprと言うコマンドを使います.man lprとすると説明が読めます.lprは印刷すべき情報をlpdに渡して,lpdは設定されたプリンタに情報を送ります.

プリンタの設定は,/etc/printcapというファイルに書かれます.
 man printcap
とすると説明が読めます.さきほどやった設定の意味を再確認してください。

印刷状況はlpqというコマンドで確認でき、印刷を取り消すにはlprmというコマンドを使いますが、さらに細かいプリンタのコントロールができるのが、lpcというコマンドです。パスが通っていないので起動するには
 /usr/sbin/lpc
とタイプします.使い方はlpcの中でhelpと打ってみて下さい.

** シェルスクリプト [#wc18894a]

*** 参考になるページ [#n5bbe26f]

- http://warp.syns.net/10/
- http://www.stackasterisk.jp/tech/systemManagement/bash03_01.jsp
- http://www.ybi.co.jp/koike/src/BSH.htm
- http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html
- http://www.elect.chuo-u.ac.jp/tsuki/~tsun/lang/sh/
- http://www.ep.sci.hokudai.ac.jp/~inex/y2002/1101/1101_script.html

*** シェルスクリプトとは? [#b444b564]

シェルにおける一連のコマンド操作をプログラムとしてファイルに記録しておいて、あとで再現する(実行させる)ことができます。たとえば、以下のような手順でシェルスクリプトを作成します。

+ テキストエディタで、以下の内容のファイルを作成する。
 #! /bin/sh
 echo "---start---"
 ps -aux | grep X
 echo "----end---"
+ ファイルを、psxという名前で保存する。
+ 次のようにタイプして、psxを実行可能にする。
 chmod 755 psx
+ psxを実行する。どのようになりましたか?
 ./psx

つまり、以上のようにすると、コマンドラインで「./psx」と打つことで、「ps -aux | grep X」と打ったのと同じ効果が得られるようになります。このように、シェルでよく行う手順をあらかじめ記録しておくのがシェルスクリプトです。

なお、1行目の「#! /bin/sh」はシェルスクリプトを実行するシェルを指定するもので、必ずこのように書くようにしてください。

*** シェル変数 [#dcce2ab8]

シェルスクリプトの中では(中でなくても)、変数を使うことができます。

- 変数への代入は、「変数名=値」とする。
- 変数の値の参照は、頭にドルマークをつけて「$変数名」とする。
- 下記はシェルスクリプトの例。
 #! /bin/sh
 msg="This is a pen." 
 echo $msg

- コマンドライン引数は、「$*」という特殊な変数で得られる。
 #! /bin/sh
 echo $*

- コマンドライン引数を1ずつ取り出したいときには、「$1」「$2」…などという表記を用いる。
 #! /bin/sh
 echo $3 $2 $1

- キーボードから文字列を読み込むには、readというコマンドを用いる。
 #! /bin/sh
 read str
 echo $str

- コマンドの実行結果を変数に代入するには、「`」(バッククオート)を用いる。
 #! /bin/sh
 lsout=`ls -la`
 echo $lsout

*** 制御構造 [#e5514378]

シェルスクリプトの中では、各種制御構造が使えます。

- if
 if 条件文
 then
     条件文と一致した場合の処理
 fi
 
 if 条件文
 then
     条件文と一致した場合の処理
 else
     条件文と一致しなかった場合の処理
 fi

-- 実際にはifは、たいてい [ ] というコマンドと一緒に使います。以下はシェルスクリプトの例。
 #! /bin/sh
 read key
 if [ "$key" = "y" ]
 then
     echo "YES!"
 else
     echo "NO!"
 fi
-- コマンド [ ] の詳しい説明は、「man test」で調べることができます。

- while
 while 条件文
 do
     条件文と一致した時の処理
 done

-- シェルスクリプトの例。
 #! /bin/sh
 key="y"
 while [ "$key" = "y" ]
 do
    echo -n "continue? (y/n) "
    read key
 done
 echo "end."

- for
 for 変数 in リスト
 do
     リストの項目を1つずつ変数に代入して処理
 done

-- シェルスクリプトの例。
 #! /bin/sh
 for i in 1 2 3 4 5 6 7 8 9 10
 do
     echo $i
 done

- case
 case 文字列 in
     パターン1) パターン1に一致した時の処理 ;;
     パターン2) パターン2に一致した時の処理 ;;
 esac

*** 課題(シェルスクリプト) [#p3b9fbfc]

以下のような手順を実現するシェルスクリプトを作成し、(添付ファイルではなく)電子メールの本文に貼り付けて、アドレス「report@fig.ele.eng.tamagawa.ac.jp」まで提出してください。メール提出後、教員または教育補助員に報告して確認してもらい、OKをもらったら(だいたい正解していたら)次に進んでください。
- メールアドレスの「@」はコピーしないで、半角文字で打ち直すこと。

+ 画面に「I am an iMac!」と表示するシェルスクリプト。
-- 実行例
 $ ./imac        ← たとえば imac という名前のシェルスクリプトにした。 
 I am an iMac!   ← 実行結果。
-- ヒント: echo
+ コマンド引数で指定したディレクトリに、C言語のソースファイルがあるか調べるシェルスクリプト。
-- 実行例
 $ ./findc prog  ← prog というディレクトリを調べる。
 prog/test1.c    ← 実行結果。見付かったファイルが列挙される。
 prog/test2.c
 prog/test3.c
-- ヒント: find, 引数の取り出し($1)
+ キーボードからの入力を求め、それが「L」だったら「LEFT」、「R」だったら「RIGHT」と表示するシェルスクリプト。
-- 実行例
 $ ./asklr       ← シェルスクリプトの実行。
 Input L or R ?  ← 「L」か「R」を入力するように要求してくる。
 R               ← ユーザが「R」と入力。
 RIGHT           ← 結果表示。
-- ヒント: read, if
+ コマンドの引数で与えられた複数の文字列をたてに表示するシェルスクリプト。
-- 実行例
 $ ./vecho yamada takeuchi nakamura shiozawa gogo!
 yamada
 takeuchi
 nakamura
 shiozawa
 gogo!
-- ヒント: for, 引数の取り出し($*)

** 第3回レポート [#v503dff0]

【問1】 以下のような動作をするシェルスクリプトを作成しなさい。この問題よりも先に、課題の問題が終わらなかった人はそちらを優先させてください。できるところまでがんばってやってください。

+ コマンド引数で与えられたファイルを、誰からも読めなくするシェルスクリプト。
-- 実行例
 $ ./secret himitsu.txt
+ C言語のソースファイル(拡張子が .c のファイル)を全部つなげて、1つの大きなテキストファイルにするシェルスクリプト。
-- 実行例(リダイレクト(>)が不要にしてもよい)
 $ ./cmerge > cfiles.txt
+ 「I am an iMac!」と表示するシェルスクリプトを改良して、自分のホスト名(コンピュータ名)を表示するシェルスクリプト。
-- 実行例
 $ ./hi
 Hi! My name is a01.cad.eng.tamagawa.ac.jp.
+ ユーザが「stop」と入力するまで、時刻を表示し続けるシェルスクリプト。
-- 実行例
 $ ./dateloop                          ← シェルスクリプトを起動すると、
 2005年  5月 11日 水曜日 11:44:01 JST  ← 時刻を表示して入力待ちになる。
                                       ← ただ [Enter] を押したり、
 2005年  5月 11日 水曜日 11:44:05 JST
 aaaa                                  ← 適当な文字や、
 2005年  5月 11日 水曜日 11:44:36 JST
 123                                   ← 適当な数字を入れると続行する。
 2005年  5月 11日 水曜日 11:44:40 JST
 stop                                  ← 「stop」と入力すると終了する。
+ コマンドラインで指定した月(複数)のカレンダを表示するシェルスクリプト。
-- 実行例
 $ ./mcal 4 5           ←コマンドの入力。4月と5月を指定。
      April 2005        ←以下、結果出力。4月と5月のカレンダー。
 Su Mo Tu We Th Fr Sa
                 1  2
  3  4  5  6  7  8  9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30
 
       May 2005
 Su Mo Tu We Th Fr Sa
  1  2  3  4  5  6  7
  8  9 10 11 12 13 14
 15 16 17 18 19 20 21
 22 23 24 25 26 27 28
 29 30 31

【問2】 以下の言葉をすべて使って、UNIXのサーバについて簡潔に説明する文章を作成しなさい。その際、用語集のような箇条書きではなくて、教科書のようにつながった文章で書くようになさい。なお、無駄に長い文章(コピペ)を送りつけてくる者がいるが、文章は説明すべき内容にふさわしい簡潔な長さにまとめること。

- サーバ
- クライアント
- lpd
- ftpd
- httpd
- inetd
- デーモン(daemon)
- ps
- サーバのログ
- syslog

以上

【提出期限】 
- 次回実験開始まで(開始後のものは受け付けない)。

【提出方法】 
- hi-shiozawa@adms.tamagawa.ac.jp に電子メールで提出(Linuxからでなくてもよい)。
-- メールアドレスの「@」はコピーしないで、半角文字で打ち直すこと。

【PC演習室】
- 演習室のPCからも、Linuxに大学のサーバにログインして、Linuxを使うことができます。「Tera Term Pro」というソフト(Windows用のtelnet)を探して、演習室のサーバ x1.educ.tamagawa.ac.jp にログインしてください。Linuxが使えます。
- Cygwinというソフトを使うと、WindowsでもUNIXのシェルやコマンドが使えるようになります。
-- http://www.cygwin.com
-- http://www.sixnine.net/cygwin/
- 実験の時間中に終わらなかった場合には、途中経過を大学のメールアドレス等に送ることができるはずです。
-- http://mails.educ.tamagawa.ac.jp

【注意事項】
- この実験に限らず、レポートでは自分の名前を最初に書くこと。
- である調(「だ」「である」)を用い、ですます調(「です」「ます」)は用いないこと。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS