情報科学概論
2003.4.22
プログラミング実習を行うためには,基本的なコマンド操作が必要になります.
先週の授業で簡単なコマンドに関して操作しましたが,今回からは実際にプログ
ラミングに必要な操作を中心に実習します.コマンド全般に関しては,「コン
ピュータセミナー」の時間に行います.
「ファイルシステム」とは,コンピュータの中にある様々なデータを利用可能に
するためのシステムで,階層的に配置して取り扱うのが基本です.Windowsや
Macintosh,UNIX系の各OSでそれぞれ異なったシステムを利用していますが,階
層的に扱うことに関しては大体一致しています.階層的とは,先週のディレクト
リのときに紹介したような木の根から枝葉にいたるような順序だった構造のこと
です.教室のパソコンでは / (ルート)というディレクトリの中に様々
なディレクトリがあり,その中にまたいろいろなディレクトリやファイルがある
構成のことです.
UNIXの特徴としては,なんでも「ファイル」として対象を扱うことで,それによ
り統一された操作で種々のデバイスを扱えるようになっています.ただし,みな
さんはまだ通常のファイル以外のものを取り扱うことはほとんど無いので,今の
ところはそのような難しいことを考える必要はありません.知っておくのは,プ
ログラムや設定ファイルのような「文書」でも,それらを入れるディレクトリで
も同じような cp (コピー)コマンドで操作できることです.(ただし,
オプションに違いが出てきます.)
今日の実習では,まず,コマンドの出力結果を画面に表示させる場合とファイルに保存
する場合の違いについて試してみます.以下の操作を行ってみましょう.
先週行った date などのコマンド結果は画面に表示されました.この
とき,画面のことを難しい言葉で「標準出力」と言います.標準と言うのは何も
しなければそこに出力されるためです.また,標準出力以外に出力することを
「リダイレクト」(迂回)と言います.次の例で試してみましょう.
$ date
$ date > aaa
二つの操作の結果の違いは画面を見れば明らかですが,では2度目の結果はいっ
たいどうなったのでしょうか.
2番目のコマンドの結果は aaa という名前のファイルになっています.
それまで aaa というファイルが無かった場合には新しく作られます.
前から存在していた場合には書き換えられます.では,aaa の中身を
見てみましょう.
$ cat aaa
ここで使う cat といのは Concatenate
という名前を縮めたもので,本来は「連結する」ですが,オマケ
の用途である中身を表示する方が良く使われるものです.結果は画面に
表示されたはずですが,2番目の date コマンドの結果であ
ることはすぐにわかるでしょう.上の cat は引数にファイル
名を指定しましたが,指定しないとキーボードからの入力(これを「標
準入力」と言います)をそのまま表示するだけです.やめるには,C
- D (Ctrlキーを押したまま「D」のキーを押す)の操作が必要です.
先ほど「リダイレクト」してファイルにコマンドの結果を出力するときには不等
号(>)を使用しました.これでは,先ほども注意したようにファイルがすでに存
在する場合には書き換えられてしまいます.このような書き換えを「上書き」と
いいますが,毎回書き換えられては困る場合もあります.そこで,末尾に追加す
る方法を試してみましょう.
$ date >> aaa
このように不等号二つ >> でリダイレクトすると末尾への追加
となります.cat で確認してみましょう.
先週,jman コマンドによりコマンドの使用方法を学習しましたが,そ
のときマニュアルページはスペースキーを押すことにより1ページずつ表示され
ました.これと同じように,画面に収まり切れない長い表示を1ページずつ表示
するものを「ページャ」と言い,代表的なものに less があります.
例えば,次のようにしてみて下さい.
$ less .canna
これは,日本語入力を行うためのプログラムである「かんな」の設定ファイル
.canna の中身を表示するコマンドですが,jman
のときと同様に1ページ分ずつ表示します.1行ずつのスクロールも矢
印キーにより可能です.終わるには「q」のキーを押します.
コマンドの出力結果が長い場合に,結果を less に渡して処理しても
らうと,先ほどのようにページに別けた表示が可能になります.中身を見るコマ
ンドとして先ほど cat を学習しましたから,それを使ってみましょう.
$ cat .canna
$ cat .canna | less
こちらも違いは明らかですね.でも,二つめのコマンドは先ほど実行した
$ less .canna
と結果的に同じなので意味が無いかも知れません.でも,こうすれば違いが出ま
す.
$ cat -n .canna | less
結果はどうでしたか.プログラムの修正などでは何行目に問題があるのかが重要
なことがあります.このような方法を知っておくことは大切です.
自分でプログラムを作成して実行すると,ときとして終了しないまずいプログラ
ムを作ってしまう可能性があります.そのときには,放っておくと延々と処理を
行い,いつまでも終了しないので問題です.それを止めるためには,一番荒っぽ
いものとして C - C があります.これにより問題となったプログラム
を強制終了できます.
しかし,ターミナルで実行してプロンプトが戻ってこないから C - C
を入力するのはわかりやすいですが,バックグラウンド処理と言われるものは何
がどこで悪さをしているのかわかりません.例えば,Netscape や Sylpheed の
動きが遅くなったりしたときにはそのプログラムを指定して止めなければなりま
せん.そのためにはプロセスを表示するコマンドが必要になります.
$ ps
というのがそれです.ps は簡単に推測できるように Process の略ですね.た
だし,上記のコマンドでは表示されるプロセス(実行中のプログラム)はほとんど
ありません.これにはオプションが必要なのです.また,ps コマンド
はオプションを入れるときにハイフンが不要です.引数をとらないコマンドなの
でオプションであることが明白だからでしょう.
$ ps ax
ではどうでしょうか.さまざまなプログラムが裏で動いていることがわかるでしょ
うか.多過ぎて画面に収まり切れません.先ほどと同じように less
で繋ぐことも効果的でしょう.しかし,もう一つ別の処理に引き継いでもらいま
しょう.
$ ps ax | grep netscape
Netscape を利用してテキストを見ている人ならここでプロセス番号がすぐにわ
かるはずです.今出て来た grep というのは検索コマンドです.指定
した文字列を含む行を抜き出してくれます.便利なコマンドですので覚えておい
た方が良いでしょう.これにより,目的とするプロセス(プログラム)のIDが検出
できます.
さて,悪さをしているプロセスが見つかったら,次には,それを終了させます.
既に問題が起こっているので普通の操作では終了してくれません.そこで,コマ
ンドにより強制終了させる場合の例を示します.例えば,いま,ある一つのターミナルが反
応しなくなって消したいと思っているとしましょう.もし,ちょうど良いターミ
ナルが動作していなかったら
$ gnome-terminal &
として一つ起動しておきましょう.そして,先ほどと同様に検索してみます.
$ ps ax | grep gnome
すると,ありました.ターミナルの方の行の最初の数字がコンピュータが管理し
ているターミナルのプロセス番号です.それを終了させるには kill
という恐ろしい名前のコマンドを使います.
$ kill *****
当然,上の*****のところには自分で確認したプロセス番号を入れます.どうで
すか.ちゃんと終了させることができたでしょうか.
ちゃんと終了した場合には,コマンド入力したターミナルでEnterキーを押すと
のようにメッセージが出ます.最初の括弧つきの番号はジョブ番号と言ってその
ターミナルから実行した仕事の番号です.
ディレクトリはファイルを階層的に整理するのに役立つ概念です.Windowsでは
「フォルダ」と呼ばれていますが,中身は同じものです.これにより,自分で作
業するときのファイルの置き場所がすっきりして見通しが良くなるのは経験した
人ならわかるでしょう.UNIXにおいては,コマンド操作でディレクトリを扱うこ
とも可能ですし,ファイルマネージャを使って視覚的に操作することもできます.
ファイルマネージャとの比較は「コンピュータセミナー」の方で行いますので,
ここではコマンドライン操作で実習してみましょう.
ディレクトリ作成のコマンドは mkdir です.例によって短縮されてい
ますが,make directory から由来しています.作成するディ
レクトリの名前が引数になります.この授業では今後スクリプトをたく
さん作成して行きますので,それらを整理するためのディレクトリを作っ
てみましょう.場所はホームディレクトリとします.先週実習した
pwd コマンドで確認してください.もし,違うディレクトリにい
たらホームディレクトリに移動してください.
$ mkdir script
これによりディレクトリが作成されます.ls コマンドで確認してくだ
さい.ちゃんと作業できたら,その中に移動しましょう.
$ cd script
ディレクトリの消去にはいくつかの方法がありますが,ここでは統一的な操作の
ためにファイルを消去する場合と同じ rm を使います.Remove の略ですね.消す
操作の実習のためにはまず消しても良いディレクトリを作成しましょう.
$ mkdir test
$ cd test
$ date > bbb
としてみましょう.これで,script ディレクトリの中に test
ディレクトリが作られ,その中に,bbb というファイル
ができました.では,自分がいる場所を消すのはおかしいので,別の場
所に移動しておきましょう.
$ cd ..
自分がいる場所を pwd コマンドで確認し,ls コマンドでファ
イルを把握してください.今自分が作業している場所がどのような構成なのか,
わかりますか?
では,実際にコマンドを実行してみましょう.
$ rm test
としてみたら,いきなりエラーが表示されました.
どうやらディレクトリは消せないようです.これでは作業ができません.こんな
ときは,jman の出番です.どうすれば,ディレクトリが消せるのか調
べてみましょう.
UNIXではファイルを消去したらその瞬間に消えます.Windowsのようにいったん
ゴミ箱に入って後から取り止めると言うことはできません.そのため,ファイル
の消去は慎重に行う必要があります.できれば,-i オプションを利用
して対話的に作業をする方が良いでしょう.メッセージを確認しならが作業がで
きます.また,ファイル名などを補完機能(入門UNIX p.174)により間違えないようにするのも重要
な要素です.
今日はディレクトリとファイルの取り扱いについて学習しました.上記の内容を
参考に以下のような構成となるディレクトリを作成してみましょう.以下の作業
ではディレクトリ以外にファイルもいくつか作成する必要があります.その際に
は,便利なコマンドとして touch がありますので,使ってみましょう.
このコマンドは中身の無いファイル名だけのファイルを作成することができます.
$ touch ccc
上のように入力すると,ccc というファイルが作成されていますが,
その中身はありません.
また,ディレクトリ移動コマンドの cd は,「相対パス」という,自分が
いまいるディレクトリから見た位置関係で移動場所を指定することが可能です.
その際には,上にあがるために先ほど使用した .. が大事ですので,
これも実習しましょう.ファイル名を表示する ls コマンドもディレ
クトリを指定して実行することが可能です.例えば,上の階層のディレクトリに
あるファイル一覧を表示させるには
$ ls ..
のようにします.二つ上の階層であれば引数として ../.. を指定しま
す.このような表示によるディレクトリの位置指定を「相対パス」と言います.
自分がいる位置からの相対的な位置を示しているからです.また,単に「パス」
と言うこともあります.
以下の図に示すような構成のディレクトリ群をコマンドにより作成してください.
図1 目標とするディレクトリ群の構成
図1に示す構成において b12_d ディレクトリにいるときに,
$ cd ../..
とすると,どこに移動するか,図を見て考えてからコマンドを実行し,自分の予
想とあっているかどうかを確かめてみましょう.
一番上の階層である top_d ディレクトリがカレントディレクトリのと
き,ファイル b22 の中身を表示させるためにはどのようなコマンドを
実行すれば良いか,考えてみてから実際に確かめてみましょう.
a01_d ディレクトリにいるとき,c01 の中身を見るためには
どのような「パス」を持つコマンドを使用すれば良いか,また,
b21 を見たいときにはどう変わるか,調べてみましょう.さら
に,
a11_d ディレクトリにいるときに,ファイル b22 の中身を
表示させるためには,ファイル名の前につける「パス」をどのように指
定すれば良いか,考えてみましょう.
授業の最後にクラス別に簡単なテスト(Aクラス)
および(Bクラス)をしますので,アナウンスに注意してください.
宿題もAクラスとBクラス別に用意します.詳細は授業の最後に紹介します.こちらもアナウンスに注意してください.
次に学習するのは,コマンドの結果を別のコマンドに受け継ぐ方法です.これは,
UNIXの「思想」とも言えるべきもので,様々な処理をする際に,一つのプログラ
ムがそれを全部担当するとプログラム作成の手間も修正の手間も大変であること,汎用性が
無くなること,などから単純な処理を行う小さなプログラムを使い分けて作業す
ることが好まれていることから実に良く利用される方法です.このような処理の
引渡しを「パイプ」と言います.これにより,複数の処理を効率的に一回のコマ
ンドにすることが可能になります.次の例で試してみましょう.
[1]+ Terminated gnome-terminal
rm: `test' はディレクトリです
目次ページに戻る