Program02

プログラム作成基本実習 第 2 回
情報システム科 鈴木 康弘
平成 19 年 5 月 28 日
今日の目標
1
最近では Linux の世界でもデスクトップ環境が普及し、ファイルのコピーや削除といった基本操作はド
ラック&ドロップで行う(GUI 1 操作)ことが一般的である。ただし、よりきめ細かな操作を行うには、コ
マンドラインを活用(CUI 2 操作)した方が有利である。今回は、コマンドラインの基本的な操作方法につ
いて学ぶ。
シェルの概要
2
ユーザがキーボードから入力したコマンドを処理し、OS の中心部分であるカーネルに伝えるのは「シェ
ル」と呼ばれる種類のプログラムの役割である。シェルは「ターミナル」と呼ばれるプログラムを介して、
ユーザとシステムの中心部分であるカーネルの橋渡しをする。本章では、ターミナルとシェルの概要につい
て学ぶ。
2.1
ターミナル
キーボードからコマンドを入力して、それを実行するには「ターミナルエミュレータ」(端末エミュレー
タ)を使用する。UNIX システムが登場した当時のコンピュータは、本体にシリアル回線を介してキャラ
クタ端末(文字しか表示できない端末)を複数台接続し、何人かのユーザで使うといった使い方が主流で
あった。ターミナルエミュレータは、そのキャラクタ端末をデスクトップ上のウィンドウに再現したもので
ある。
1 Graphical User Interface:ユーザに対する情報の表示にグラフィックを多用し、大半の基礎的な操作をマウスなどのポインティ
ングデバイスによって行なうことができるユーザインターフェースのこと。
2 Character-based User Interface:ユーザに対する情報の表示を文字によって行ない、すべての操作をキーボードを用いて行な
うユーザインターフェースのこと。
1
シェル
2.2
実はユーザの入力したコマンドを実行しているのは、ターミナルのようなターミナルエミュレータでは
ない。システムの中止部分の核となるカーネルに対し、ユーザが入力したコマンドを解釈して伝えるのは
「シェル」と呼ばれるプログラムの役割となる。シェルは「貝殻」というような意味であるが,ここから、
カーネルを包み込んで、ユーザとカーネルの橋渡しをする大事なプログラムであると考えてほしい。
シェルは一般に「コマンドインタプリタ3 」と呼ばれる種類のプログラムである。シェルには様々な種類
があり、Linux では「bash」が標準シェルになっている。なお、ユーザがログインしたときに自動的に使用
されるシェルのことを「ログインシェル」と呼ぶ。
シェルの種類
sh sh は最も古くからあるシェルで、開発者の Stephen R. Bourne 氏にちなみ「Bourne シェル(B シェ
ル)」と呼ばれている。対話機能に乏しいため、現在ではログインシェルとして使用されることはあま
りない。ただし、ほぼ全ての UNIX システムに標準で用意されているため、シェルスクリプト(シェ
ルで記述したプログラム)の標準記述言語として広く使用されている。
bash sh の上位互換シェル。
「生まれ変わった Bourne シェル」という意味で bash(Bourne Again Shell)と
名づけられた。sh に比べ、特に対話機能が強化され、Linux では標準シェルとして採用されている。
csh カリフォルニア大学バークレー校で開発されたシェルで、if 文や while 文といった制御構造が C 言語
の文法を基にしているため、一般に「C シェル」と呼ばれている。かなり古くからあるシェルだが,
bash や tcsh のような高機能シェルに比べると使いやすいとは言えない。
tcsh csh の機能拡張版。ファイル名保管機能やコマンドライン編集機能が強化され、C シェルの流れを汲
むシェルとしては最も広く使用されている。
zsh 比較的新しいシェルで熱心なユーザが増えている。非常に高機能なシェルで bash や tcsh の後継と目
されている。
3 interpreter:人間がプログラミング言語で記述したソフトウェアの設計図 (ソースコード) を、コンピュータが実行できる形式
(オブジェクトコード) に変換しながら、そのプログラムを実行するソフトウェア。インタプリタ型の言語はプログラムの実行時に変
換を行なうため、その分だけコンパイラ型言語よりも遅い。
2
2.3
コマンドの実行
ターミナルのウィンドウ内の最初の部分を見てほしい。表示の内容は環境によって異なるが、初期状態で
はつぎのような形式の行が表示されている。
<ユーザ名>@<ホスト名>:<ディレクトリ名>$
これは「プロンプト」(正確には「コマンドプロンプト」)と呼ばれるもので、システムが現在コマンド
を受け付けられる状態になっていることユーザに伝えるものである。
なお、最後の「ディレクトリ名」の部分は「カレントディレクトリ」(現在自分がいるディレクトリ)に
なります。ターミナルを立ち上げた時点では、カレントディレクトリは「ホームディレクトリ」(ユーザが
自由に使って良いディレクトリ)となる。ホームディレクトリはチルダ「˜」で表記されるため、初期状態
ではカレントディレクトリ部分はこれで表示されている。
2.3.1
実際に
コマンドを実行するには、プロンプトに続いてコマンド名をタイプし Enter キーを押す。それでは、簡単
なコマンドを実行してみよう。
knoppix@Knoppix:~$ uname [Enter]
Linux
knoppix@Knoppix:~$
「Linux」と表示されたはずである。この uname というのは OS に関する情報を表示するコマンドである。
単に「uname」とすると OS の名前だけが表示される。
コマンドの実行が終わると再びプロンプトが表示され、次のコマンドを受け付けられる状態であること
を示す。続いて「date」を入力してみる、現在の日付と時刻が表示されるはずである。
knoppix@Knoppix:~$ date [Enter]
2007 年 5 月 28 日月曜日 14:00:00 JST
knoppix@Knoppix:~$
2.3.2
引数(ひきすう)
コマンドによって何らかの値を受け取って、それを元に処理を行って結果を返す。それらの値のことを
「引数」と呼ぶ。引数は 1 つだけの場合もある。引数はコマンド名の後にスペースで区切って指定する。
<コマンド> <引数 1 > <引数 2 > <引数 3 >・
・
・
3
たとえば、与えられた引数をそのまま画面に表示する単純なコマンドに「echo」がある。プロンプトに続
いて「echo Hello」と入力してみてほしい。次の行に引数として渡した「Hello」がそのまま表示される。
knoppix@Knoppix:~$ echo Hello [Enter]
Hello
echo コマンドは複数の引数を渡すことが出来る。たとえば、引数を 2 つ渡すと、
knoppix@Knoppix:~$ echo Hello Linux [Enter]
Hello Linux
また、次のコマンドを実行してほしい。
knoppix@Knoppix:~$ echo $SHELL [Enter]
/bin/bash
結果が「/bin/bash」と表示されたら bash が使用されている。echo コマンドの引数に「$SHELL」を
指定しているが、これは「シェルの環境変数」
(後日学ぶ)と呼ばれる変数で、シェルの動作を設定したり、
設定内容を確認するのに使用される。
2.3.3
オプション
引数の中でコマンドに渡す指令のようなものを、とくにコマンドの「オプション」と呼ぶ。オプションの
指定方法はコマンドによって異なるが、多くの場合ハイフン「-」に続いてアルファベット 1 文字、あるい
はハイフン 2 つ「–」に続いて英単語で指定する。
たとえば、前述の OS の情報を表示する uname コマンドの場合「-r」(「–release」でも同じ意)オプショ
ンを指定して実行すると、OS のリリース番号を表示する。
knoppix@Knoppix:~$ uname -r [Enter]
2.619
2.3.4
これ以降のプロンプト表示
プロンプトはユーザの環境によって表示が異なるので、本実習のこれ以降の記載は、プロンプトを単に
「$」で表すこととする。また [Enter] は記載しない。
knoppix@Knoppix:~$ → $
4
3
ファイルシステムのディレクトリ構造
Linux のファイルシステムは、ルートを頂点とする段階構造となっている。「ルート」(root)とは、「木
の根っこ」という意味であるが、段階構造を逆さにすると木のように見えるため「ツリー構造」と呼ばれて
いる。木の枝の分岐点にあたる部分が「ディレクトリ」、葉っぱにあたる部分が「ファイル」となる。
かつては、ファイルシステム内のディレクトリの名前や役割には大まかな基準はあっても、細かな部分で
は UNIX システムごとにまちまちであった。それではシステム毎に互換性がとれないということで、最近
では「FHS(Filesystem Hierarchy Standard:http://www.pathname.com/fhs/)」と呼ばれる UNIX シス
テムにおける階層構造の標準化仕様が提唱されている。
5
各ユーザはディレクトリが割り当てられている。これを「ホームディレクトリ」と呼び、デスクトップでは
「ホームフォルダ」に対応する。ホームディレクトリはルート「/」ディレクトリの下の home ディレクトリ
の下4 に、ユーザ毎に用意されている。たとえば、ユーザ「bell-tree」のホームディレクトリは「/home/bell-
tree」になる。基本的に一般ユーザ(管理者ユーザではないユーザ)が自由に使って良いのは自分のホーム
ディレクトリの下だけである。アクセス制限が設定されているため、たとえば他のユーザのホームディレク
トリの下のファイルを見たり、ファイルを作成することはできない。
3.1
絶対パスと相対パス
指定したディレクトリやファイルまでの道筋のことを「パス(Path)」と呼ぶ。パスは多くのコマンドの
引数に使用され、その表記には、絶対パスと相対パスの 2 種類が有る。
3.1.1
絶対パスによる指定
絶対パスはルート「/」から順にツリー構造をたどって行く指定方式である。Linux のファイルシステム
はルート「/」、つまり根っこを起点とするツリー構造であるから、この方法では目的のディレクトリやファ
イルは必ず一意(ユニーク)に指定できる。この場合、まず先頭にルートディレクトリを表す「/」で区切っ
て指定する。たとえば、ユーザ「bell-tree」までの絶対パスは、次のように記述できる。
絶対パスの指定
/home/bell-tree
ファイルを絶対パスで指定したい場合、最後にファイル名を記述する。たとえば、ユーザ「bell-tree」の
ホームディレクトリの下の「Readme.txt」
(Linux ではファイル名の大文字・小文字は区別されるので注意)
というファイルは次のように指定する。
/home/bell-tree/Readme.txt
3.1.2
相対パスによる指定
現在自分がいるディレクトリのことを「カレントディレクトリ」という。相対パスはカレントディレクト
リから相対的にパスを指定する方法である。たとえば、ターミナルを開いた初期の状態ではホームディレク
トリがカレントディレクトリとなる。その下の Readme.txt ファイルは相対パスでは、次のように指定する。
Readme.txt
また、ホームディレクトリの下の photos ディレクトリのファイル「tree.jpg」は次のように指定する
photos/tree.jpg
4 KNOPPIX では、home ディレクトリは「KNOPPIX.IMG」のなかに格納されており、適所にマウント(ソフトウェア的な接
続処理)されているために、分かりにくい構造になっている。そのおかげで、ユーザのファイルが変更できるのだが。
6
ディレクトリの内容の表示と移動
4
相対パスと絶対パスによるパスの指定方法は理解できたところで、ディレクトリの一覧を表示する ls コ
マンドと、カレントディレクトリを移動する cd コマンドについて説明する。
4.1
ディレクトリの一覧表示
コマンド ls (ディレクトリの一覧を表示する)
ls <オプション> <ディレクトリのパス>
引数には一覧を表示したいディレクトリのパスを指定する。パスは、絶対パス、相対パス、どちらで指定
しても良い。またカレントディレクトリを表示したい場合は、引数は不要である。
オプションを次のように指定することで詳細情報の表示や、隠しファイル(設定ファイル「ドットファイ
ル」)を含めた全てのファイルを表示することが出来る。
詳細情報の表示 ls -l
全てのファイル表示 ls -a
たとえば、「ls -l Desktop」を実行すると、
drwxr-xr-x 2 knoppix knoppix 1024 2007-01-12 06:53 Trush
-rw-r--r-- 1 knoppix knoppix 567 2007-05-24 19:33 KNOPPIX.desktop
などと、表示される。詳細は書きとめていただきたい。
4.2
カレントディレクトリの移動
ターミナルを起動した状態では、ホームディレクトリがカレントディレクトリであるが、cd コマンドを
使用すると、必要に応じてカレントディレクトリを移動することが出来る。
コマンド ls (カレントディレクトリを移動する)
cd <オプション> <移動先のディレクトリのパス>
また、現在のカレントディレクトリを表示するには pwd コマンドを使用します。
コマンド pwd (カレントディレクトリを表示する)
pwd
Linux などの UNIX システムでは、通常のファイルだけでなく、ディレクトリ、さらにはディスクなどの
周辺機器もファイルの仲間として扱う。
7
4.3
記号によるディレクトリの指定
シェルには特別な役割をする記号が用意されている。それらの記号のことをシェルの「メタキャラクタ」
と呼ぶ。bash には多くのメタキャラクタがあるが、ここでは、その中から、特定のディレクトリを簡単に
指定するための記号を紹介する。(表 1)
表 1: ディレクトリを表す記号
記号 説明
4.4
˜
ホームディレクトリ
˜..
直前にいたディレクトリ
.
カレントディレクトリ
1 つ上のディレクトリ
ワイルドカード
シェルのメタキャラクタには「ワイルドカード」と呼ばれる種類の記号がある。ワイルドカードは、トラ
ンプのジョーカと同様に, ファイル名のなかのいろいろな文字と一致する魔法の記号である。コマンドの引
数で、ファイル名やディレクトリをまとめて指定するのに便利である。
ワイルドカードの種類を表 2 に示す。
記号
5
表 2: ワイルドカード
説明
任意の 1 文字
?
*
[文字の並び]
0 文字以上の任意の文字列
[ ]内で指定されたいずれかの 1 文字
{ 文字列 1, 文字列 2,・
・
・}
{ } 内で指定されたいずれかの文字列
課題
1. 自分の使用している OS の種類とリリース番号をコマンドにより調べなさい。
2. 「現在の日時は」の表示に続き、現在の日時を表示させなさい。
(別々のコマンドを実行するので、結
果は 2 行になる。)
3. 「私の使用しているシェルは・
・
・です。」と表示させなさい。(・
・
・には現在使用しているシェルを
$SHELL で指定)
4. 以下の内容を Gedit(「K メニュー」→「エディタ」→「Gedit」)を使用して記入し、
「resetdir.sh」と
いう名前でホームディレクトリに保存しなさい。
8
———–「resetdir.sh」の内容———–
# !/bin/sh
# プログラムの開始
echo START ResetDir
# 作成予定のディレクトリがあれば消去
cd ~
rm -r ProDir
# ディレクトリの作成
mkdir ProDir
mkdir ProDir/Pro1
mkdir ProDir/Pro1/Exercise
mkdir ProDir/Pro1/Temp
# テストファイルの作成
cd ~/ProDir/Pro1/Exercise
echo "1. 問題:" > pro1.txt
echo " 回答:" >> pro1.txt
cd ../Temp
cal > Cal.txt
man ls > lsman.doc
# プログラムの修了
cd ~
echo END ResetDir
5. ホームディレクトリをカレントディレクトリとして、「sh resetdir.sh」を実行しなさい。
6. ホームディレクトリのなかにある、Exercise ディレクトリに絶対パスによる指定で移動しなさい。
7. カレントディレクトリを Exercise ディレクトリとし、ディレクトリを一覧表示させなさい。
8. カレントディレクトリ Exercise から相対パスによる指定で Temp ディレクトリに移動しなさい。
9. カレントディレクトリを Temp ディレクトリとし、ディレクトリの txt ファイルだけ(ワイルドカー
ドを使用して)を詳細一覧表示させなさい。
10. Temp ディレクトリにファイル名の一部に「man」がつくファイルが格納されている。一覧表示させ
なさい。その後記号によるディレクトリの指定でホームディレクトリに移動しなさい。
11. 課題 1∼10 で実行したコマンドと返ってきた結果をメールで [email protected] に提出し
なさい(コマンドと結果はテキストで本文中に埋め込むこと)。
ただし、本文の最初に名前を記入しておき、件名は第 2 回プ作実習とすること。期限は本日 16 時と
する。1 通しか受け取らないのでちゃんと確認し送信すること。
9