基礎情報処理演習(地球工学科1回生T2クラス)

第4回 UNIXの基本(その2)(プロセス・ジョブ管理とシェル変数・環境変数) とファイルの整理

(教科書 第4章,第6章)


授業計画一覧に戻る


今日の演習内容

今日は、UNIX のプロセス・ジョブ管理とシェル変数・環境変数について解説し、それらを理解するための簡単なコマンド操作を実習する。
また、ファイル操作の練習として、各自のファイルの整理を実習する。

[基礎]
・ファイル名の展開について理解する。
・UNIX のプロセス・ジョブ管理について理解する。
・UNIX のシェル変数・環境変数について理解する。
・コマンドのエイリアス機能について理解する。

[発展]
・シェルスクリプトについて理解する。

[実習]
・上記の各内容を実習する。
・ファイルの整理を行う。


今日の演習

まず、教科書などを参考にしながら次の事項について理解しなさい。
ただし、教科書(第6章)の記述は、TC Shell [tcsh] についてのものであるので、注意すること。

ファイル名の展開について (教科書 4.4.5)

shell では、ファイル名の指定が簡単に行えるように「ファイル名の展開」という機能を提供している。コマンド行でファイル名を指定するとき、あるパターンを指定するとshell がその部分をパターンに一致する全てのファイル名に置き換えてくれる機能である。

UNIX のプロセス・ジョブ管理について (教科書 6.4.1)

  1. 通常、shell ではキーボードからコマンドやプログラムを実行させるが、この処理の単位をジョブ(job)と呼ぶ。
  2. 実行プログラムの最小単位をプロセスと呼ぶ。したがって、1つのジョブは複数のプロセスを含むことがある。
  3. shell を通じてジョブを実行すると、ジョブが終了するまでプロンプトが現れないものを、フォアグラウンドジョブと呼ぶ。逆に、ジョブを起動しても直後にプロンプトが現れ、結果を待つことなく他のジョブを実行することのできるジョブをバックグラウンドジョブと呼ぶ。
  4. 自分が起動したプロセス、ジョブに対しては、自分自身で責任を持たなければならない。 (なお、初期設定では、特別に指示がなければログアウト時に全てのジョブを終了させる。)

シェル変数・環境変数について (教科書 6.4.2)

どういう環境でコマンドを実行させるかを決定するのがシェル変数と環境変数である。
 ・シェル変数:シェルの実行環境の設定
 ・環境変数 :プロセスの実行環境の設定
すなわち、環境変数は大域的な環境を規定する変数で、シェル変数は局所的な環境を規定する変数と考えてよい。
註:「変数」とは、値の容れ物と考えると理解しやすいでしょう。

コマンドのエイリアス機能について (教科書 6.4.3)

特定のオプション付のコマンド、連続実行する複数のコマンド、パイプやリダイレクションを利用して一行のコマンドラインで書ける一連のコマンドを、別のコマンド名で登録して利用する機能をエイリアス機能と呼ぶ。

シェルスクリプトについて (教科書 6.4.5)

shell は通常インタラクティブ(対話的)に使われるが、ある決まった一連のコマンドを繰り返す必要のある時、これらのコマンドをあらかじめファイルに記述して、これを自動的に実行することができる。このファイルをシェルスクリプトあるいはシェルプログラムと呼ぶ。
また、コマンドとして使用できるシェルスクリプトをシェルコマンドと呼ぶ。


今日の実習・・・その前に

電子メールの添付ファイルの機能を利用して、ファイルを受信する方法を解説します。
第2回の課題ファイルを第3回の演習時に送付できている人は、添付ファイルのついたメールが送られているので確認しなさい。

これだと受信した添付ファイルでデスクトップがいっぱいになるので、ファイルを整理します。
GNOME 端末を開いて、

mkdir mypic (新しいディレクトリを作成。)
ls Desktop (ファイル名を確認。ディレクトリ名は大文字小文字が区別されることに注意。)
mv ~/Desktop/filename.JPG mypic (拡張子の大文字小文字も区別するので注意。移動が成功すればデスクトップのアイコンが消える。)

(一休み)このファイルをデスクトップの背景に指定してみよう。
背景でファイルを指定しないようにして右クリックすると、背景の変更をするプルアップメニューが表示される。
一番下の部分を選択して、ファイルを追加してみよう。


今日の実習

以下の実習の説明では、コンピュータにキーボードから入力するコマンド部分を青字で表示している。
(また、青字のコマンドは、ウェブページ上で2行以上にわたって表示されていても1行で入力しなさい。)

前回同様、コマンドヒストリーをファイル出力し、それを Emacs で編集したものを本日の提出課題とするので、コマンドヒストリーが200個以上保存される設定になっているか確認しなさい。

すなわち、

echo $HISTSIZE

と入力し、シェル変数HISTSIZEが、

1000

と表示されるのを確認する。

200以上の数字でない場合は、TAに申し出て下さい。


以下のコマンドを実行しなさい。
教科書はtschについての解説であり、このページの内容(bash)とは詳細な点で必ずしも一致しないので、注意して下さい。

<ファイル名の展開>

cd /usr/bin (多くのファイルが保存されているディレクトリーに移動)
ls (ファイルをリスト表示する)
ls w* (w ではじまる全てのファイルを表示)
ls wh* (wh ではじまる全てのファイルを表示)
ls wh? (wh ではじまり、3文字のファイルを全て表示)
ls [w-y]* (w, x, y ではじまるファイルを全て表示)
cd (元のディレクトリーに戻る)

<プロセス・ジョブ管理>

xclock (フォアグラウンドで起動。[C-c]で停止・終了)
xclock & (バックグラウンドで起動)
ps (プロセスの確認)
ps -f (プロセス詳細の表示)
ps -f -u a0zzzzz (user a0zzzzz のプロセス詳細の表示)
kill xxxx (xxxx:プロセス番号(PID)。xload のプロセス番号を指定して、プロセスの強制終了)
xclock & (バックグラウンドで起動。)
xload & (バックグラウンドで起動。字体に関するエラーが出るが無視する。)
jobs -l (ジョブ番号の確認)
kill %x (x:ジョブ番号(はじめの[x])。xload のジョブ番号を指定して、ジョブの強制終了)
ps -f (プロセスの確認)
jobs -l (ジョブが終了しているか確認)
fg (フォアグラウンドジョブに変更。[C-z]で中断され、プロンプトへ入力できる)
xclock & (もう一つ時計を起動。こちらは動いているはずです。)
jobs -l (ジョブの状態を確認)
bg %y (y: ジョブ番号。止まっている方の時計をバックグラウンドジョブとして復活)

<シェル変数の確認と変更>

-bash- 3.00 $ set (シェル変数の表示、確認)
-bash- 3.00 $ echo $USER (個別のシェル変数の表示)
-bash- 3.00 $ ps -f -u $USER (シェル変数USER の利用例)
-bash- 3.00 $ echo $PS1 (変数PS1が、表示されるプロンプトの内容を保存している。)
-bash- 3.00 $ PS1="I love you! \$ " (変数を変更するには、変数名を直接=で結ぶ。)
I love you! $ (表示されるプロンプトが変わっていますか?もう一つGNOME 端末を開いて下さい。こちらのプロンプトはどうなっていますか?)
-bash- 3.00 $ echo $PS1 (両方の端末で試して下さい。)
I love you! $ PS1="\u:\t \w \$ " (元の端末に戻って、もう少し実用的なプロンプトに変えてみます。)
a0xxxxxx:11:00:00 ~ $ cd /usr/bin (カレントディレクトリーを移動してみます。)
a0xxxxxx:11:00:05 /usr/bin $ (プロンプトにカレントディレクトリーが表示されていることを確認)
a0xxxxxx:11:00:15 /usr/bin $ PS1="\s-\v\$ " (プロンプトを元の設定に戻す)
-bash- 3.00 $ cd (元のディレクトリに戻っておきましょう。)
-bash- 3.00 $ echo $ZZZ (シェル変数ZZZ を表示。何もないはずです。)
-bash- 3.00 $ ZZZ="I LOVE YOU" (シェル変数ZZZ を定義する。)
-bash- 3.00 $ echo $ZZZ (シェル変数ZZZ を表示。)
-bash- 3.00 $ set (シェル変数の表示、確認。一番最後にあるはず。)
-bash- 3.00 $ unset ZZZ (シェル変数ZZZ を消去。)
-bash- 3.00 $ set (シェル変数の表示、確認)
-bash- 3.00 $ env (環境変数の表示、確認)

プロンプトが消えたとき、キーを受け付けているようなら、PS1="\s-\v\$ " と入力して、再度変数を設定してみる。
それでもダメな場合は、GNOME 端末を強制終了させる。

<エイリアス機能>

la (la (エルエー)というコマンドがないか確認)
alias la='ls -alF' (la エイリアスを設定。laと=、=と'の間にスペースはいれてはいけない。)
la (la エイリアスを実行。実際に行われるかどうか確認)
unalias la (la エイリアスを解除)
la (la エイリアスが解除されたか確認)
alias (alias だけを入力すると現在設定されているエイリアスが表示される。)

<シェルスクリプト>

emacs sc1 & (ファイルsc1 の作成。作成後保存[C-x C-s] する。Emacs は終了しなくてもよい。)

下記内容のファイルを作成する。

echo ""
echo "Hello, how are YOU ?"
echo ""
echo "number of files = "
ls -al | wc -l
echo ""
echo "Current time is"
date
echo "Good Luck !"
echo ""


bash sc1 (シェルスクリプトの実行)
(emacs sc1 &) (←emacsを閉じていれば再実行。ファイルsc1 の編集。再保存。)

下記の1行をsc1 ファイルの1行目に追加する。

#!/bin/bash -f

もちろん忘れずに編集した内容を保存[C-x C-s] して下さい。

ls -lF (ファイルモードの確認)
chmod +x sc1 (ファイルを実行可能にする)
ls -lF (ファイルモードの確認。実行ファイルにはファイル名の後ろに「*」が付いている。)
~/sc1 (シェルコマンドsc1 を実行)

ファイルの整理

1.まず、不要なファイルを削除する。以下のファイルは不要なので全部削除すること。

ファイルの削除には rm コマンド (ReMove) を使います。

UNIX では一旦消したファイルは絶対に戻せません。

rm test.log

設定によっては rm: remove 通常ファイル 'test.log: ? と聞いてくる。y か n かで答える。(エイリアスで、rm='rm -i'となっているからです。)

rm *~

とすると、途中が任意の文字で ~ で終わるファイルすべてが消去される。便利だが危険なので注意すること。

ls するとファイルが削除されていることがわかる。

ls

2.次に、ファイルを分類して保管する。

2.1 ファイルを整理するためのディレクトリを作る。

まず、Emacs の課題で作成したファイルを入れるためのディレクトリ emacsfile を作る(ディレクトリ名は何でもよい)。

mkdir emacsfile

ls コマンドで新しいディレクトリができていることを確認。

2.2 ファイルをディレクトリに移動する。

Emacs の課題で作成したファイル (ここでは、kadai0426.txt と987654321.txt とする)をディレクトリ Emacs に移動するには、

mv kadai0426.txt 987654321.txt emacsfile

2.3 確認する。

ls
ls emacsfile

ホームディレクトリからファイルがなくなっていること、ディレクトリ emacsfile にファイルが移動していることを確認する。

■ファイルの作成はこれからも続きます。

使うごとにファイルは増えます。整理しないとすぐに何のファイルだったか分からなくなります。ファイルを整理する習慣をつけておくこと。


今日の提出課題

上で行った実習のコマンドヒストリー(本日分)をファイルに保存し、それをプリントアウトして提出しなさい。

ただし、以下の例のようにヒストリーは1行につき2つずつ、コラムを揃うように編集すること。
また、ファイルの1行目に学生番号(必ず半角数字)、氏名をこの順に記入すること。

(例)
9999999 地球太郎

20 13:16 set
21 13:16 pwd
22 13:16 ls
23 13:16 ls /
   ・
   ・
   ・
46 13:22 ls -F
47 13:22 cd text/
48 13:22 ls
49 13:22 ls -F
   ・
   ・
   ・

(例終わり)


 ヒント

  1. コマンドヒストリーをファイル(例えば history1.txt)に保存する。

    history > history1.txt

  2. history1.txt のバックアップをとっておく。

    cp history1.txt history1.bak

  3. history1.txtのコピーhistory2.txtを作る。

    cp history1.txt history2.txt

  4. history1.txt, history2.txt を Emacs で編集する。

    history1.txt, history2.txt にそれぞれ1から100までのヒストリーが記録されていたとすると、

    emacs history1.txt &−−− history1.txt は1から50までのヒストリーを記録(51から100は削除)
    emacs history2.txt &−−− history2.txt は51から100までのヒストリーを記録 (1から50は削除)

  5. pasteコマンドを用いてhistory1.txtと history2.txt を水平に連結し、history3.txt に保存する。

    paste history1.txt history2.txt > history3.txt

  6. history3.txt をEmacs で編集する。

    emacs history3.txt &

  7. lpr コマンドでhistory3.txt ファイルをプリントアウトする。

    a2ps history3.txt | lpr

次週までに


戻る