第1週


Getting Started


今週はかなり忙しい授業になりそうです。 課題の回答を教官に報告するためには、UNIXマシンにログインし 色々なコマンドを実行し更にその結果を教官宛に電子メイルで送る必要が あります。 今週中にそのレベルまで知識をつけましょう。 それではまずUNIXシステムの基礎の説明からです。

*UNIXシステムの基礎

UNIXシステムの基礎を学習したところで、次はUNIXの世界におけるあなたの まわりの環境を見ていきましょう。 皆さんの多くはUNIXの世界では右も左もわからない赤ん坊のようなものだと 思います。 本当の赤ん坊の場合は「耳でまわりの音を聞き」、「目が開いてまわりの状況を 眺め」、「まわりにいる人を認識し」というふうに自分の世界を広げてゆきます。 皆さんもまわりの世界を眺めてみることで自分の世界を広げてゆきましょう。

*You are NOT alone !

UNIXシステムの世界が少しは見えてきたでしょうか。 それではいよいよ電子メイルの送り方を学習することにしましょう。

*教官への電子メイルの送り方

それではこの授業で最初の課題です。

+今日の課題

これで今日の授業は終りです。 どうもお疲れ様でした。


ホームへ戻る
スケジュールへ戻る

UNIXシステムの基礎

UNIXシステムの特徴としては「マルチタスク」、「マルチユーザー」、 「切替え可能のコマンドインタープリータ(シェル)」、「パイプ」、 「リダイレクト」などがあると思います。 「マルチタスク」とか「マルチユーザー」とはどういうことでしょうか。

+マルチタスクは快適
+マルチユーザーは安全

皆さんは「コマンドインタープリータ」というのは初めて聞く言葉かも知れません。 更にUNIXシステムでは、その「コマンドインタープリータ」が切替え可能で 「シェル」とか呼ばれる別名が付いているというのだから、もうついていけないと 思うかも知れませんが、まあ少しつき合って下さい。 では説明を始めましょう。

+コマンドインタープリータとは
+シェルって何?

UNIXシステムの特徴といえるもので便利なものに「パイプ」と 「リダイレクト」があります(パイプとリダイレクトは最近のDOSでも 一部採用されています)。

+パイプはコマンドどうしをつなぐ
+リダイレクトはコマンドとファイルをつなぐ

以上UNIXの特徴で代表的なものを説明しました。 いきなり多くの新しい概念が出てきて戸惑ったかも知れませんが、これらの 特徴についてはこの授業を続けていくうちに実感できるようになると思います。

今週の最初に戻る

マルチタスクは快適

マルチ(Multi-)というのは「多くの」という意味です。 タスクとは「仕事」というような意味でしょうか。

コンピュータは皆さんもご存知のように演算プロセッサー(CPU)が内蔵 されていて、それでもって計算を行ないます。 最も簡単な計算のやり方は、1つのプログラム(タスク)をCPUに送り込ん でやって結果を見て、その後次のプログラムをCPUに送り込むという計算方法 です。 このやり方を1つのタスクだけが実行されるという意味で「シングルタスク」 と呼びます。

もう少し複雑な使い方として、いくつかのプログラムを同時に実行する計算方法が あります(といっても計算機の中で適当に実行時間の割り振りをしているだけ です)。 この方法を多くのタスクを同時に実行するという意味で「マルチタスク」と 呼びます。 従ってUNIXシステムでは同時に多数のタスクを実行することが できます。まとめると、

このマルチタスクの利点はCPUを沢山使うタスクの裏側(Background)で CPUをあまり使わない多くのタスクを実行することにより計算機使用の 環境を快適なものにすることです。 ですからUNIXシステムを充分に使いこなせばシングルタスクのパソコン よりも快適なはずです(最近の Windows もマルチタスク化されつつあります)。 またマルチタスクは「マルチユーザー」を実現するためにも不可欠な条件です。

以下のコマンドを端末で打ち込んでみて下さい。下にある「%」はコマンド プロンプトと呼ばれるもので(今使っている計算機の 場合は「alpha01.sci.hiroshima-u.ac.jp>」というようなプロンプトに なっているかも知れません)あなたが打ち込まなくても端末上に出ています から打ち込む必要はありません。

    % ps u

このコマンドが端末上に出すメッセージは、あなたのために計算機上で 実行されているタスク(プロセスとも呼ばれます)を示しています。 1行が1プロセスに対応しています。 次に以下のコマンドを打ち込んで下さい。

    % ps axu

このコマンドで出てくるメッセージは、計算機上で実行されている全ての タスクのリストです。 計算機上ではユーザーが快適に仕事ができるように多くのタスクが動いています。

元に戻る

マルチユーザーは安全

「マルチユーザー」というのはユーザーが多くいるという意味です。 パソコンを使用したことがある人ならわかると思いますがパソコンの場合 には「ユーザー」という概念がありません。 例えば1台のパソコンを今Aさんが使っているとしましょう。 Aさんは間もなく仕事を終えてパソコンを離れます。 その後待ちかねていたBさんがパソコンを使い始めるということに なると思います。 この場合2つの問題点があります。

これを解決するには、AさんとBさんが同時に仕事ができること(これは先の 「マルチタスク」により解決済み)と、Aさんが作ったファイルとBさんが 作る(あるいは消す)ファイルを区別できることが必要です。 ここで「ユーザー」という概念が生じてきます。 UNIXシステムに限らずマルチユーザーのシステムではユーザーアカウント と呼ばれるユーザーが存在します。 これにより過失によるファイルの消去などが起こらないように、つまりある ユーザーは他のユーザーのファイルを消せなくなっています。 また故意のファイル消去を防ぐためにユーザーアカウントにはパスワード が設定されていて、そのユーザーアカウントに設定されているパスワードを 正しく打ち込んでログインしない限りそのユーザーとしてコマンドを実行 できなくなっています。

皆さんはすでにUNIXワークステーションにログインしているわけですから、 ユーザーアカウントを持っていて各自の正しいパスワードを知っているわけです。 ログイン時に「Login:」に対して打ち込んだのがユーザーアカウント名で 「Password:」に対して打ち込んだのがパスワードです。 パスワードは上でも述べたように、故意のファイル消去などを避けるために 設定されているものですから友達といえども決して教えてはなりません。

元に戻る

コマンドインタープリータとは

コマンドインタープリータを直訳すると「コマンド」を「説明する者」です。 ではコマンドインタープリータは「何のため」に「誰」にコマンドを説明して 「どうして」それが必要なのでしょうか。 この問いの「何のため」は「ユーザーの要求をみたすため」で「誰」は 「UNIXのオペレーティングシステム(OS)」です。 では「どうして」それが必要なのでしょうか。

通常UNIXのオペレーティングシステムは実行中の多くのタスクを効率良くかつ 民主的に実行するために頑張っています。 でもそのままであればユーザーは自分の新しいプログラム(タスク)の実行を オペレーティングシステムに頼むことができません。 そこでユーザーとオペレーティングシステムの間でプログラム実行の橋渡し をするのがコマンドインタープリータです。

UNIXなどのオペレーティングシステムではコマンドインタープリータは もう一つの役割を担っています。 UNIXシステムでプログラムを実行するにはプログラムファイル名を 打ち込みます(パソコンのDOSオペレーティングシステムと同様ですね)。 所詮はそれだけなのですが実際にプログラムを実行しようとすると困ることが あります。

例えばあるプログラム「command」が1個のファイル「file000」を読む時に、 コマンドとして「command file000」と打ち込むとします。 この例では何も問題はありません。 しかし 1000個のファイル「file000 file001 ... file999」があって このファイルを一気に読みたい時に、コマンドとして「command file000 file001 ... file999」と打ち込まないといけないとすると気が狂ってしまいます。 UNIXシステムの場合には解決策があって「command file*」で終りです。 ここで「*」は「ワイルドカード」と呼ばれコマンドインタープリータが 自動的に「000」から「999」で置き代えます(正確に言うと少し違いますが ここではそう解釈して下さい)。

この他にもコマンドインタープリータには「シェル変数の設定と代入」、 「コマンドの履歴と再利用」、「条件判断」など色々な機能が組み込まれていて ユーザーが計算機を使い易くするのに役立ちます。

元に戻る

シェルって何?

コマンドインタープリータについて少しは理解できたでしょうか。 パソコンのオペレーティングシステムであるDOSでは、このコマンドインター プリータは1種類でその機能はパソコンの機種が変わっても変わりません (ただしOSのバージョンアップに従って少しは変わります)。 この辺の事情は最近はやりの Windows でも同じです。 本来コマンドインタープリータはユーザーフレンドリーで有るべきなのですが、 コマンドインタープリータが変わらないということはいつまでたっても不満な 点が改まらないということです。

UNIXシステムでは色々な特徴を持ったコマンドインタープリータが 何種類もあり、ユーザーのニーズにしたがって切替えることができます。 1つ1つのコマンドインタープリータを「シェル(shell、殻という意味)」と 呼びます。 この切替えは各ユーザー毎に行なうことができますし、あるユーザーが ログイン中に自分の使っているシェルをその場で切替えることもできます。 従ってユーザーは自分の作業に最適のシェルを常に選ぶことができます (とはいっても普通の人は気に入ったシェル1つだけを使っているようです)。

またUNIXのシェルの特徴はシェル自体がコマンドプログラムである ということです。 ですから能力のある人は自作のシェルというものを作って使用する ことも可能です(とっても大変でしょうが)。 以下のコマンドであなたが今使っているシェルを確認することができます (コマンドの意味については今は聞かないで下さい)。

    % echo $SHELL

おそらく「/bin/csh」というふうなメッセージが出たと思います。 それがあなたの使っているシェルの名前であると同時にそのシェルを実行 する時のコマンドファイル名でもあります。

元に戻る

パイプはコマンドどうしをつなぐ

大抵のオペレーテリングシステムではコマンドを打つと端末にその結果が 出てきます。 これは端末が「標準出力」となっているからです。 「標準出力」とは最初から標準的に設定されている出力という意味でしょう。 またこれに対して「標準入力」というものもあります。 UNIXシステムのコマンドは常に「標準入力」からデータが入ってきて 「標準出力」にデータが抜けていくことを仮定しています。 これは当たり前に聞こえるかも知れませんがとても重要なことです。 UNIXではデータは一種の流れ(ストリーム、stream)と考えられ、 コマンドはこの流れの間に差し挟まれたフィルターと解釈することが できます。

コマンドを実行するとデータの流れがフィルターされ流れ出たデータが 端末に出ます。 しかしこれだけでは面白く有りませんし、わざわざデータを流れと 解釈したメリットがありません。 そこで流れ出てくるデータを次のコマンドへ流してやればデータを 本当に流れのように取り扱うことができます。 これを行なうのが「パイプ」です。 パイプはコマンドとしては「|」を用います(アルファベットの「I」ではなくて 縦棒の記号「|」です)。 下の ps コマンドは以前使いました。

    % ps axu

この ps コマンドと sort とういコマンドをパイプでつないでみましょう。

    % ps axu | sort

上の例では ps コマンドから出てきた出力はパイプに吸い込まれて 直接は出て来ずに sort コマンドで処理されたものだけが出て来ます。 結果を見てわかるように sort コマンドは入力されたデータ行をアルファベット 順に並べ替えるコマンドです。 パイプはいくらでもつなぐことができます。

    % ps axu | sort | grep root

上で出てきた grep コマンドはある文字列(ここでは「root」)を含む行のみを 抜き出すコマンドです。 更にパイプをつなぐと

    % ps axu | sort | grep root | head
    % ps axu | sort | grep root | tail

新しく出てきたコマンド head と tail はそれぞれデータの最初の部分や最後の 部分のみを表示するコマンドです。 どうです、パイプの使い方と便利さは理解できたでしょうか。

元へ戻る

リダイレクトはコマンドとファイルをつなぐ

パイプのところで学んだように、UNIXシステムではデータは流れ コマンドはフィルターと考えられ、パイプがそれをつないでゆきます。 データの流れの行き着く先は端末画面です。 画面にでたデータは頭の中に記憶するとか読みとってノートに記録するしか 保存方がありません。 データの保存ということを考えるとこのデータの流れの行き着く先を ファイルにできたら非常に便利です。 それを行なうのがリダイレクトです。 リダイレクトのコマンドは「>」を用います。

    % ps axu | sort > sorted_ps.txt
    % cat sorted_ps.txt
    % cat sorted_ps.txt | grep root

ここでは標準出力を sorted_ps.txt というファイルにリダイレクトしましたので 最初のコマンドの実行時には端末画面に何も出てきません。 コマンド cat はファイルの内容を端末に表示するコマンドです。 このようにコマンドの出力を一旦ファイルに保存し別のコマンドの 実行時に入力として再利用できます。 上の例では sorted_ps.txt は何も変更が加えられていませんから一旦ファイル に保存する意味があまりありませんが、エディタなどで編集を行なってから 次のコマンドの入力とするということも可能です。 では一旦ファイルに落したデータを利用する場合には常に cat コマンドを 使う必要があるのでしょうか。 実はそんな必要はなくてファイルを標準入力に入れるリダイレクト「<」が あります。

    % grep root < sorted_ps.txt
    % grep root < sorted_ps.txt | head

どうです、リダイレクトの意味と使い方がわかったでしょうか。

元へ戻る

You are NOT alone !

自分は誰かということは聞くまでもないと思いますが一応調べてみましょう。

    % whoami

このコマンドの回答はユーザー名(ログインアカウント名)です。 皆さんの場合はユーザー名が学籍番号か何かになっていてこんなの 私じゃないと思うかも知れませんが、このコンピュータ上ではそれが あなたの正式名です。 では今あなたはどこにいるのでしょうか。

    % pwd

コマンド pwd は「present working directory(今作業しているディレクトリー)」 を示すコマンドです。 ここでディレクトリーというのが出てきました。 ディレクトリーという考え方はパソコン(DOS)の世界でもおなじみだと 思います。 またMACの世界の言葉で言うとフォルダー(folder)に相当します。 UNIXの世界では階層構造をとっている一番上のディレクトリーの名前 が「/」で通常ルートディレクトリーと呼ばれます。 上のコマンドを実行した時の回答は「/home/users/u0872xxx」の様なものだった と思います。 その意味はあなたの今居るディレクトリーが、一番上のディレクトリー「/」の 下の「/home」というディレクトリーのそのまた下の「/home/users」の更に 下の「/home/users/u0872xxx」だということを示しています。 では、一つ上の世界へ登ってまわりを眺めてみましょう。

    % cd ..
    % pwd
    % ls

このコマンドの実行には結構時間がかかりますので答がなかなか返ってこない といって心配しないで下さい。 まず cd というコマンドは「change directory」という意味で先に出て きた pwd を変更するコマンドです。 cd コマンドとともに打ち込んだ「..」は1つ上のディレクトリーという意味です。 ls コマンドは pwd にあるファイルを全てリストアップします。 おそらくそのディレクトリーには皆さんの仲間のディレクトリー(ホーム ディレクトリー)が沢山あるはずです。 更に上にいってみましょう。

    % cd ../..
    % pwd
    % ls

「../..」というのは一つ上のそのまた一つ上のディレクトリーという意味です。 何だかわけのわからないファイルがいっぱい有って遠くへ来過ぎた気がするので 家に(あなたのホームディレクトリーに)帰ることにしましょう。

    % cd
    % pwd
    % ls

家に帰るのは実に簡単です。 あなたはこのディレクトリーの下に自由に自分の世界を作ることができます。 しかし自分の家にはファイルが少ししかなくて寂しいですね。 自分のホームディレクトリーの下にもディレクトリーを作ってみることに しましょう。

    % mkdir week01
    % ls
    % cd week01
    % pwd
    % ls

mkdir というコマンドは新たにディレクトリーをつくるコマンドです。 あなたの世界初のディレクトリー「week01」ができました。 あなたのホームディレクトリーの下にディレクトリーを作るメリットは、 大体予想がつくと思いますが、ファイルをその用途毎や種類毎に分類して しまい込むのに便利な点です。 この授業でも各週作るファイルを分類して保存しておくことをお勧めします。 さっそく今日作ったファイルをこのディレクトリーに保存しましょう。

    % ls
    % mv ../sorted_ps.txt ./
    % ls

コマンド mv は「move(移動)」という意味で、あるファイルを移動あるいは名称変更 します。 上の例では一つ上のディレクトリーにある sorted_ps.txt というファイル を現在のディレクトリーに移しています。 「./」あるいは「.」というのは「..」と似ていますが現在のディレクトリー という意味です。 mv コマンドの名称変更の例を一つやってみましょう。

    % ls
    % mv sorted_ps.txt sorted_ps.renamed
    % ls

さて自分の家や家のまわりを探検するのはこれくらいにしてまわりの住人 を探してみましょう。 あなたのまわりで端末の前に座りこの授業を受けている人達ももちろん まわりの住人には違いないのですが、今言っている住人はUNIXシステム の中の住人のことです。 計算機にログインしている住人を調べましょう。

    % who
    % finger

どちらのコマンドも現在ログイン中の人達を教えてくれます。 finger コマンドの方が情報量が多いようです。 ある人(その人のユーザー名を仮に「u0872000」とします)の情報をもっと 知りたければ finger コマンドが使えます。

    % finger u0872000

上で使った who コマンドはあなたが現在ログイン中の計算機にログインしている 人達を表示しますが、あなたが使用中の計算機がつながれているネットワーク 上の計算機にログインしている人を全て見たければ rwho コマンドが使えます。

    % rwho

運が良ければ沢山の人の名前が見えるはずです。 あなたが住んでいるUNIXの世界や住人が少しは見えてきたでしょうか。

今週の最初に戻る

教官への電子メイルの送り方

この授業では課題の解答や質問を電子メイル(e-mail)にて教官に送ります。 その送り方を説明しましょう。 電子メイルを送るのに必要な情報は普通の郵便と似ていて以下のようなものです。

普通の郵便と少し違う点は、

自分の名前を付けないと相手が困ると心配するかもしれませんがメイルを 出すコマンドが自動的に付けてくれます。 従って電子メイルには匿名のメイルというものがありません。 サブジェクトはメイルを受け取る人がメイルを分類するのに役立ちます。 電子メイルを書く時に心がけて欲しいのは、

メイルを送るコマンドは色々あるのですが今は「mail」というのを 使いましょう(この計算機では mailx というコマンドに mail という別名を 付けていますので他の計算機では正式名 mailx を使って下さい)。 mail での電子メイルの出し方はいくつかあります。

    % mail -s 'サブジェクト' 宛名
    % mail -s 'サブジェクト' 宛名 < ファイル名
    % コマンド | mail -s 'サブジェクト' 宛名

全ての例で共通なサブジェクト部分はそのメイルの内容をかいつまんだものを 書いて下さい。 例えば 'report of the 1st week' とか 'question on exercise' とか です。 サブジェクトは必ず2つの「'」で囲って下さい。 また宛名の部分はメイルを送りたい人のアドレスを書きます。 送りたい人が複数の場合は空白で区切って全てのメイルアドレスを 並べます。

最初の例はコマンドを打った後に送りたい手紙の内容を端末から打ち込みます。 適当に改行して打ち込み最後に CONTROL-d を打つとメイルが送られます (コントロールキーを押しながら d を打ちます。CONTROL-d はUNIXの 世界では「これで終り」という意味でしばしば用いられます)。 この方法はそれほど長くないメイルを送る場合に便利です。 2番目の方法はメイルの内容を書いたファイルを予めエディタなどを使って つくっておきリダイレクトにより mail に渡しています。 比較的長いメイルを送るのに適しています。 最後の方法ではコマンドなどの結果をパイプによりエディタに渡しています。 普通は使いませんが今週の課題の報告にはこの方法も使うことにします。

教官に電子メイルを送るには教官のメイルアドレスが必要です。 この授業では

    asakaguc@sci.hiroshima-u.ac.jp
というメイルアドレスを使って下さい。 またメイルを送る際には同時に自分にもメイルを送ることをお勧めします。 そうすれば出したメイルの内容を後で必要な時に確認できますし確かにメイルが 送られたということも確認できます。

今週の最初に戻る

今週の課題

今週の課題は難しくありません。 今までやった学習中に出てきたコマンドの出力をメイルで教官に送るだけです。 まず「UNIXシステムの基礎」のところでは sorted_ps.txt というファイルを つくりました(その後「You are NOT alone !」のところで sorted_ps.renamed と いう名前に変更しました)。 このファイルを教官に送りましょう。 あなたのユーザー名が u0872000 だとすると以下のように入力して下さい。

    % mail -s 'サブジェクト' asakaguc@sci.hiroshima-u.ac.jp u0872000 \ 
      < sorted_ps.renamed

上のコマンドは先にも出てきた存在するファイルをメイルの内容として リダイレクトにより mail に渡すコマンドです。 サブジェクト部分は内容がわかるように自分で考えて下さい。 上のコマンドのところで「\」はコマンドを次の行に続けるという意味です。 使っているキーボードに依っては「\」が無い場合があります。 その場合は「円(日本の通貨)」マークを使って下さい。 コマンドが長くなり過ぎて打ち難い場合にこの方法を使うと良いでしょう。 メイルの宛先は教官とあなた自身です。

次に「You are NOT alone !」のところでは、ログインしている人達のユーザー 名を調べました。 その出力を教官に送りましょう。

    % rwho | mail -s 'サブジェクト' asakaguc@sci.hiroshima-u.ac.jp u0872000

では最後に教官に「Hello!」と送りましょう。 あれば更に何かメッセージを付け加えても結構です。 メイルの書式としてメイルの最後には署名を入れるのが良いでしょう。 メイルの内容の入力終了の合図は CONTROL-d ということを忘れないように。

    % mail -s 'サブジェクト' asakaguc@sci.hiroshima-u.ac.jp u0872000
    Hello!
                                      Many regards,
                                     (your full name)
    CONTROL-d

これで課題は終了です。

今週の最初に戻る