2002年度後期 IT教育基礎論演習B

第1回: UNIX基礎

概要と目標

■ 概要

UNIXオペレーティングシステムを利用するための基本操作を習得する。

■ 目標

目次


演習内容

■ はじめに〜UNIXオペレーティングシステムとは

UNIXとは、オペレーティングシステム(OS、基本ソフト)の1つ。 OSとは、コンピュータシステム上のプロセス管理、ファイル管理、ユーザ管理等、 コンピュータシステムを利用するための最も基本的な機能を提供し、 コンピュータシステム上で稼動するアプリケーションソフトウェアの 共通基盤を担うソフトウェアである。

他のOSとしては、Windows、MacOS、OS2、Linuxなどがあるが、 教育情報システムなど、複数人で利用したり、 また、クライアントサーバシステム等の分散アプリケーションを開発するためには、 マルチプロセス機能やネットワーク機能が充実し、 これらの開発環境が利用可能なUNIXシステムが推奨される。 なお、現在注目を集めるLinuxはUNIXのクローンとして開発され、 UNIXやLinux用として提供される様々なソフトウェアを 共通に利用することができる。

本演習では、UNIXサーバシステムとして、Sun Microsystems社のNetra、 UNIXオペレーティングシステムとしてSolaris 8を利用する。

■ UNIXシステムへのログインとログアウト

UNIXを利用するためには、UNIXシステムへのログインを行う必要がある。 UNIXシステムにログインするためには、 UNIXシステムに直接接続されたコンソール端末のほかに、 PC上の端末エミュレータなどからネットワークを介して telnetやrsh、sshなどを利用することができる。 演習で使用するUNIXシステムでは、 sshによるログインを行えるように設定してある。

Windowsシステムからsshを利用してUNIXシステムにログインするには、 フリーウェアの端末エミュレータである Tera Term Proから sshを利用できるようにした TTSSHを利用するとよい。 また他にも、SSH社から提供されている 非商用版のSSHソフトウェアなども利用できる。

□ TTSSHによるUNIXへのログイン

TTSSHによりUNIXシステムにログインするには、 図1に示す、Windowsのデスクトップ上にあるTTSSHのアイコンをダブルクリックする。

図1: TTSSH (へのリンク)のアイコン

すると、TTSSHが起動し、図2にように接続用画面が表示されるので、 「TCP/IP」を選択し、接続先ホスト名として、 演習用UNIXシステムである「voyager.ei.tohoku.ac.jp」を指定し、 またServiceとして「SSH」を選択し、OKボタンを押す。

図2: TTSSH の起動

すると、図3のような認証画面が表示されるので、 User nameに自分のユーザID(ログイン名)、 Passphraseにパスワードを入力し、OKボタンを押す。

図3: TTSSH による利用者認証

正しく認証されれば、UNIXシステムにログインし、 図4のような画面となる。

図4: TTSSH によるUNIXへのログイン

注意!!

利用者認証用のパスワードは、 決して他人に知られてはならない。 万が一パスワードを悪意のある人に知られてしまった場合、 そのユーザIDの利用者自身が被害に遭うばかりでなく、 そのIDを悪用することでインターネット上の第三者にまで 迷惑をかける事態になりかねない。 そのため、システム管理者でも各利用者のパスワードを 確認することはできないようになっている。

□ UNIXからのログアウト

ログインしたUNIXシステムの利用を終了し、ログアウトするには、 図5のように、「$」の後ろに キーボードから「exit」と入力し、 Enterキーを打つ。 このとき、決して、他のWindowsのアプリケーションと同様に ウィンドウのクローズボタンである [X]を 押して終了してはならない。 UNIXシステムに接続している場合、 仮に目に見えない形であっても何らかのプロセスが実行状態になっていることがあり、 クローズボタンにより強制的に接続を切ってしまうと、 このようなプロセスが正しく終了できない場合がある。

図5: UNIXからのログアウト

■ bashによるコマンドライン操作

UNIXシステムでは、 X Window Systemと呼ばれるグラフィカルユーザインタフェースを 利用することもできるが、 TTSSHのような端末エミュレータから利用する場合、 基本的にコマンドラインからのコマンド入力により利用することとなる。 この利用者からのコマンド入力を受け付け、 各種コマンドやソフトウェアの実行を行う ユーザインタフェースを担うソフトウェアを一般に シェル(Shell)と呼ぶ。 演習用UNIXシステムでは、標準のシェルとして、 bash(born again shell)が起動されるように設定されている。

□ コマンドの入力と実行

端末エミュレータ上の空行ではない最後の行の部分に、 「xxx@xxx:~/$ 」と表示され (xxxの部分は任意の文字列が入る)、 「   」が点滅している部分 (端末エミュレータの種類によっては、四角ではなくアンダーラインであったり、 また、点滅していない場合などもある)が、 利用者からのコマンドの入力を受け付ける場所であり、 これをコマンドプロンプトと呼ぶ (以下、コマンドプロンプトを示す記号として、 単に「$ 」と書く)。 また、この四角の点滅をカーソルと呼び、 コマンドプロンプトのある行をコマンドラインと呼ぶ。

何らかのコマンドを実行する場合、 ここにキーボードからそのコマンドを入力する。 例えば、現在日時をを画面に表示するdateコマンドを実行したい場合、 以下のようにキーボードからdateと入力した後に、 Enterキーを押す (何らかのコマンドを入力を行う際のEnterは、 以降、特に明記しない)。 すると、コマンドを入力した行の下に現在時刻が表示された後に、 次のコマンドプロンプトがまた表示される。

$ date Enter
2003年09月01日 (月) 21時14分48秒 JST
$

同様に、現在の月のカレンダーを表示するcalコマンドを実行すると、 以下のように表示される。

$ cal
     2003年  9月
日 月 火 水 木 金 土
    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

$

前述のUNIXシステムからのログアウトに使用したexitも、 シェルを終了するためのコマンドの一つである。

またbashのコマンドラインでは、BackSpaceにより カーソルのある直前の1文字を消去したり、左右のカーソルキー ()により カーソルを移動し、文字を挿入したりなど、 任意の編集を行うことも可能となっている。

□ ヒストリの利用

bashのコマンドラインでは、 「!!」や、「!」に続いて文字列を入力することにより、 過去に実行したコマンドの実行履歴(ヒストリ)を遡って利用することができる。

例えば、直前に実行したコマンドがcalコマンドであった場合、 実際のコマンドを入力する代わりに!!と入力すると、 以下のようにcalコマンドが実行される。

$ !!
     2003年  9月
日 月 火 水 木 金 土
    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

$

また、「d」で始まる最後に実行したコマンドがdateコマンドであった場合、 !dと入力すると、以下のようにdateコマンドが実行される。

$ !d
2003年09月01日 (月) 21時14分48秒 JST
$

コマンドの実行履歴のより直感的で便利な利用方法として、上下のカーソルキー ()を 利用する方法もある。 キーを押すことにより、 過去に実行したコマンドが順番に遡ってコマンドラインに表示され、 またキーを押すことにより、 これを逆にたどることができるので、 目的のコマンドが見つかったところで、 Enterキーを押せばよい。 またこのとき、コマンドラインに表示されたコマンドの文字列を 任意に修正することもできる。

■ ファイルとディレクトリ

UNIXシステムでは、Windowsシステム等と同様に、 コマンドなどのプログラムやデータ、その他各種設定などが、 ファイルを単位としてファイルシステム上に格納されている。 また、複数のファイルを束ねて保存しておく、 Windowsシステムにおけるフォルダに相当するものとしてディレクトリがある。 なお、Windowsシステムのフォルダと、UNIXシステムでいうディレクトリは、 ほぼ同等のものであると考えてよい。

□ ディレクトリ構造

Windowsシステムでは、複数の各ディスクドライブを頂点とする ディレクトリ構造によりファイルを管理するのに対し、 UNIXシステムでは、図6に示すように、 ルートディレクトリ(/)と呼ばれる唯一のディレクトリを頂点とし、 複数の階層的なサブディレクトリによる木構造からなるディレクトリにより、 ファイルを管理する。

図6: UNIXにおけるディレクトリ構造

このとき、あるディレクトリに置かれた何らかのファイルを指し示すには、 ルートディレクトリ以外のディレクトリとそのサブディレクトリもしくは そのディレクトリ上のファイルとの区切り記号として「/」を用い、 ルートディレクトリからの位置を記述する。 例えば、ルートディレクトリのサブディレクトリである usrディレクトリのさらにサブディレクトリである binディレクトリにあるファイルであるdateは、 「/usr/bin/date」のように示される。 このような、ファイルやディレクトリの位置を示したものを パス(path)と呼ぶ。

□ ホームディレクトリ

bashなどのシェルでは、現在、どのディレクトリ上で作業を行うかの状態を持ち、 現在の作業ディレクトリをカレントディレクトリと呼ぶ。 利用者認証によりUNIXシステムにログインすると、 このカレントディレクトリの初期状態として、 各利用者ごとに個別に割り当てられたディレクトリが指定される。 この利用者ごとに割り当てられたディレクトリを ホームディレクトリと呼ぶ。

UNIXシステムの設定にもよるが、 一般に、ホームディレクトリは、ルートディレクトリのサブディレクトリである homeディレクトリの下に、 各利用者のユーザIDと同じ名前のディレクトリとして用意されていることが多い。 例えば、「a1fm1001」というユーザIDの利用者のホームディレクトリは、 「/home/a1fm1001」となる。

このホームディレクトリは、 Windowsシステムでいうところの 「マイ ドキュメント」フォルダに相当すると考えて良く、 自分のホームディレクトリにあるファイルは 自由に閲覧することができるだけでなく、 新規ファイルや、サブディレクトリなども自由に作成することができる。

ちなみに、本演習で使用するUNIXシステム上の各自のホームディレクトリは、 演習室に設置されたPCにログインした際に、 ファイル共有機能を利用し、ネットワークドライブ U: として Windowsに自動的に接続されるように設定されており、 Windowsシステム上で作成した各種ファイルなども保存できるようになっている。

□ ファイルとディレクトリの操作

カレントディレクトリの確認

現在のカレントディレクトリがどこになっているかを確認するためには、 pwd(print working directory の略) コマンドを利用する。 例えば、ユーザIDが「a1fm1001」の利用者が UNIXシステムにログインした直後の状態でpwdコマンドを実行すると、 以下のように、その利用者のホームディレクトリである 「/home/a1fm1001」が画面に出力される。

$ pwd
/home/a1fm1001
$
ファイル一覧の確認

ディレクトリ上に保存されている、 ファイルやサブディレクトリの一覧を確認するには、 lsコマンド(file listの略)を利用する。 例えば、現在、カレントディレクトリがホームディレクトリとなっている状態で、 ホームディレクトリ上のファイル一覧を確認するには、 以下のようにlsコマンドを実行する。

$ ls
Mail/     doc/      profile/  src/      tex/      tmp/
$
(注) 実行結果は人によって異なる。 また、lsコマンドを実行した場合、 本来であれば以下のように「/」が表示されないが、 演習用UNIXシステムでは、ファイルとディレクトリを区別しやすいよう、 ディレクトリの場合、ディレクトリ名の末尾に 「/」が付加されて表示されるよう、設定してある。
$ ls
Mail      doc       profile   src       tex       tmp
$
ディレクトリの移動

カレントディレクトリを別のディレクトリに変更(移動)するには、 cdコマンド(change directoryの略)を利用する。 cdコマンドでは、cdコマンドに続いて空白を入れ、 その後ろに移動したい先のディレクトリのパスを指定する。 例えば、「/usr/local」に移動したい場合には、 以下のようにcdコマンドを実行する。

$ cd /usr/local
$

このとき、画面には特に何も出力されず、 次のコマンドプロンプトが表示されるだけである。 ただし、以下のようにbashのコマンドプロンプトの設定により、 $より前の部分の表示が、もともと「~/」であったものが、 「/usr/local/」に替わっていることから、 カレントディレクトリが移動したことがわかる。 また、pwdコマンドを利用して カレントディレクトリの確認を行ってもよい。

a1fm1001@voyager:~/$ cd /usr/local
a1fm1001@voyager:/usr/local/$

今、ディレクトリの移動のために、そのディレクトリの ルートディレクトリからの絶対的な位置を示すパスを指定したが、 このようなパスを絶対パスと呼ぶ。 これに対して、カレントディレクトリからの相対的な位置としてのパスを 指定することもでき、これを相対パスと呼ぶ。 例えば、カレントディレクトリが「/usr/local」である状態で、 そのサブディレクトリである「bin」に移動する場合、 以下のようにパスとして「/usr/local/bin」を指定する代わりに 単に「bin」を指定すればよい。 pwdコマンドによりカレントディレクトリを確認すると、 正しく「/usr/local/bin」に移動できたことがわかる。

$ cd bin
$ pwd
/usr/local/bin
$

相対パス指定の方法として、 「.」と「..」を利用すると便利である。 「.」は、そのディレクトリそのものを指しており、また、 「..」は、そのディレクトリの親ディレクトリを指す。 例えば、カレントディレクトリが「/usr/local/bin」である状態で、 その親ディレクトリ「/usr/local」の別のサブディレクトリである 「skel」に移動したい場合、以下のように、 移動先ディレクトリとして「../skel」と指定すればよい。

$ cd ../skel
$ pwd
/usr/local/skel
$

自分のホームディレクトリや、 ホームディレクトリ上のサブディレクトリやファイルのパスを指定する場合、 自分のホームディレクトリを示す「~」を利用すると便利である。 例えば、自分のホームディレクトリのサブディレクトリである profileディレクトリに移動する場合、 以下のように指定することができる。

$ cd ~/profile
$ pwd
/home/a1fm1001/profile
$

他の利用者のホームディレクトリを指定する場合、 「~」に続けて、その利用者のユーザIDを記述すればよい。 例えば、ユーザIDが「takashi」である利用者の ホームディレクトリに移動する場合、以下のように、 パスとして「~takashi」を指定する。

$ cd ~takashi
$ pwd
/home/takashi
$
(注) このようにUNIXシステムでは、 管理者のような特別の権限を持った利用者以外の一般の利用者でも、 他の利用者のホームディレクトリにアクセスできるようになっているため、 人に見られては困るようなファイル、 例えば、個人の連絡先などを記述したファイルなどを むやみに置いてはならない。 もし、このようなファイルを置く場合には、 他人に見られないよう、アクセス権を変更すること。

なお、自分のホームディレクトリに戻る場合には、以下のように、 cdコマンドの後ろに何も指定せず実行すれば良い。

$ cd
$ pwd
/home/a1fm1001
$
ファイル内容の確認

もし、ファイルの内容が画像や音声などのバイナリデータではなく、 文字列からなるテキストファイルであれば、 その内容をコマンドラインから確認することができる。

ファイルの内容を確認する場合、 予めそのファイルがあまり大きくないことが判っていれば、 catコマンド (concatenateの略。もともと、単にファイルの内容を確認するだけでなく、 複数のファイルを結合する用途に使用するため、この名前となっている)を 利用することができる。 catコマンドを利用してファイルの内容を確認するには、 catコマンドの後ろに空白をあけて参照したいファイルのパスを指定する。 例えば、演習用UNIXシステム用に用意されたbashの標準設定ファイルの1つである、 「/usr/local/skel/sys.bash_profile」の内容を確認するには、 以下のようにcatコマンドを実行する。

$ cat /usr/local/skel/sys.bash_profile
#
#       .bash_profile system file for voyger.ei.tohoku.a.jp
#       written by Takashi MITSUISHI, Sep 8, 2002
#

# Nothing are done at this moment. :-p
$

この場合、以下のように、このファイルが置かれているディレクトリに移動し、 相対パス指定によりファイル名のみを指定してもよい。

$ cd /usr/local/skel
$ cat sys.bash_profile
#
#       .bash_profile system file for voyger.ei.tohoku.a.jp
#       written by Takashi MITSUISHI, Sep 8, 2002
#

# Nothing are done at this moment. :-p
$

このファイルの場合、ファイルが十分小さく、 1画面に収まる程度だったのでよかったが、 もし、沢山の内容が書かれたファイルを catコマンドで確認しようとすると、 画面外にスクロールアウトしてしまい始めのほうの部分を見ることができない。 このようなファイルの内容を確認したい場合は、 moreコマンドを利用する。 例えば、同様にbashの設定ファイルの1つとして用意された 「/usr/local/skel/sys.bashrcの内容を確認するには、 以下のようにmoreコマンドの後ろに空白をあけファイル名を指定する。

$ more /usr/local/skel/sys.bashrc
#
#       .bashrc system file for voyger.ei.tohoku.a.jp
#       written by Takashi MITSUISHI, Sep 8, 2002
#

#
# set environment variables
#

#
# command search path
#
LOCALPATH=/usr/local/bin:/usr/local/gnu/bin:/usr/local/jakarta/ant/bin
LOCALPATH=${LOCALPATH}:/usr/local/pgsql/bin
SYSPATH=/opt/sfw/bin:/usr/openwin/bin:/usr/ccs/bin:/usr/bin:/usr/ucb
SYSPATH=${SYSPATH}:/usr/java/bin

PATH=${LOCALPATH}:${SYSPATH}
export PATH
unset LOCALPATH SYSPATH

#
-- 継続 --(38%)

画面のサイズにあわせてファイルの内容の表示が止まるので、 続きの1画面分を見たい場合にはスペースキーを押し、 1行ずつ先に進めたい場合にはEnterを押す。 また、1画面分前に戻りたい場合には、bキーを押し、 内容の確認を終了したい場合にはqキーを押す。

新規ディレクトリの作成

新たなディレクトリを作成する場合、 mkdirコマンド(make directoryの略)を利用する。 mkdirコマンドでは、mkdirコマンドの後ろに空白をあけて 新しく作成したいディレクトリ名を指定する。 例えば、ホームディレクトリ上に新しいディレクトリとして sampleを作成する場合、 以下のようにmkdirコマンドを実行する。

$ mkdir sample
$

新しいディレクトリが正しく作成できた場合には、 画面には何も表示されず、次のプロンプトが表示される。 以下のようにlsコマンドを利用してファイル一覧を確認すると、 ホームディレクトリ上に新しいディレクトリが出来ていることがわかる。

$ ls
Mail/     doc/      profile/  sample/   src/      tex/      tmp/
$
ファイルの複製

既にあるファイルをコピーし、新たなファイルを作成する場合、 cpコマンド(copyの略)を利用する。 cpコマンドでは、cpコマンドの後ろに 複製元ファイルのパスおよび複製先ディレクトリのパスを それぞれ空白をあけて指定する。 例えば、/usr/local/skel/sys.bashrcを ホームディレクトリ上にコピーする場合、 以下のようにcpコマンドを実行する。

$ cp /usr/local/skel/sys.bashrc ~/
$

ファイルのコピーが正しく実行できた場合には、 画面には何も表示されず、次のプロンプトが表示される。 以下のようにlsコマンドを利用してファイル一覧を確認すると、 ホームディレクトリ上にファイルが出来ていることがわかる。

$ ls
Mail/        profile/     src/         tex/
doc/         sample/      sys.bashrc   tmp/
$
ファイルの移動

今、/usr/local/skel/sys.bashrcをホームディレクトリ上にコピーしたが、 これを先に作成したsampleディレクトリ上に移動したいとする。 このように、ファイルを別のディレクトリに移動する場合には、 mvコマンド(moveの略)を利用する。 mvコマンドによりファイルを移動する場合、 mvコマンドの後ろに 移動元のファイルのパスおよび移動先ディレクトリのパスを それぞれ空白をあけて指定する。 例えば、ホームディレクトリ上のsys.bashrcsampleディレクトリに移動するには、 以下のようにmvコマンドを実行する。

$ mv sys.bashrc sample/
$

ファイルの移動が正しく実行できた場合には、 画面には何も表示されず、次のプロンプトが表示される。 以下のようにlsコマンドを利用してファイル一覧を確認し、 またsampleディレクトリに移動し、 lsコマンドを利用してファイル一覧を確認すると、 ホームディレクトリ上のファイルがsampleディレクトリに 移動していることがわかる。

$ ls
Mail/     doc/      profile/  sample/   src/      tex/      tmp/
$ cd sample
$ ls
sys.bashrc
$
ファイル名の変更

ファイル名を変更したい場合にも、 mvコマンドを利用する。 mvコマンドによりファイル名を変更する場合、 mvコマンドの後ろに 変更前のファイル名および変更後のファイル名をそれぞれ空白をあけて指定する。 例えば、sys.bashrcbashrc.sampleに変更する場合、 以下のようにmvコマンドを実行する。

$ mv sys.bashrc bashrc.sample
$

ファイル名の変更が正しく実行できた場合には、 画面には何も表示されず、次のプロンプトが表示される。 以下のようにlsコマンドを利用してファイル一覧を確認すると、 ファイル名が変更されたことがわかる。

$ ls
bashrc.sample
$
ファイルの消去

いらなくなったファイルを削除するには rmコマンド(removeの略)を利用する。 rmコマンドによりファイルを削除する場合、 rmコマンドの後ろに空白をあけて消去するファイルを指定する。 例えばsys.bashrcを消去する場合、 以下のようにrmコマンドを実行する。

$ rm sys.bashrc

すると、演習用システムでは、 実際に消去するかどうかの確認を行うよう設定してあるため、 消去してよい場合には、以下のように「y」を入力し、 Enterキーを押す。

$ rm sys.bashrc
rm: sys.bashrc を消去しますか (yes/no)? y
$

lsコマンドを利用してファイル一覧を確認すると、 sys.bashrcが消去されたことが確認できる。

$ ls
$

■ 各種コマンドの活用

□ 引数とオプション

引数

これまで、lsコマンドを単独で実行することにより、 カレントディレクトリ上のファイルやディレクトリの一覧を 表示できることを確認した。 これに対し、lsコマンドの後ろに空白をあけて ディレクトリパスを指定すると、 指定されたディレクトリ上のファイルやディレクトリの一覧を表示することができる。 例えば、以下のようにホームディレクトリ上に移動し、 ホームディレクトリのサブディレクトリである profileディレクトリを指定して lsコマンドを実行すると、 profileディレクトリ上のファイルやディレクトリの 一覧を表示することができる。

$ cd
$ ls profile/
Application Data/   NTUSER.DAT*         SendTo/             スタート メニュー/
Cookies/            NetHood/            Templates/          デスクトップ/
Favorites/          PrintHood/          ntuser.dat.LOG*
My Documents/       Recent/             ntuser.ini
$

また、catコマンドやmoreコマンドでも、 内容を表示したいファイルをコマンドの後ろに指定し、実行を行っていた。 このように、何らかのコマンドを実行する際に、 ファイル名など、そのコマンドの処理対象として指定する文字列を 引数と呼ぶ。 どのようなコマンドに対して、どのような引数を指定できるか、 またいくつの引数を指定できるかは各コマンドにより異なる。 また、コマンドと引数、引数と引数の間には、 区切り記号として空白を入れなければならない (ただし、連続する複数の空白は、1つの区切りとみなされる)。

オプション

先に、lsコマンドにより、 ディレクトリ上のファイルやディレクトリの一覧を表示できることを確認した。 ただし、これによりそのディレクトリ上の全てのファイルやディレクトリの一覧が 表示されているわけではない。 UNIXシステムでは、 「.」から始まるファイル名やディレクトリ名の付けられた ファイルやディレクトリは、 lsコマンドをそのまま実行しただけでは 一覧表示されないようになっている。 「.」で始まる名前のファイルやディレクトリも含めて一覧表示するには、 以下のように、lsコマンドの実行時に、 lsの後ろに空白を入れて「-a」を指定する。

$ ls -a
./              .bash_profile   .history        .signature      profile/
../             .bashrc         .inputrc        .ssh/           src/
.bash_history   .emacs          .mailcap        Mail/           tex/
.bash_logout    .gp_history     .psql_history   doc/            tmp/
$

また、ファイル一覧の詳しい情報を知りたい場合には、 以下のように、lsコマンドの実行時に、 lsの後ろに空白を入れて「-l」を指定する (注: 合計の数値は正しく表示されない)。

$ ls -l
合計 18
drwx------  20 a1fm1001 student     1024  9月  1日  21:58 Mail/
drwxr-xr-x  10 a1fm1001 student     1024  8月 27日  13:26 doc/
drwx--x--x  13 a1fm1001 student      512  5月  8日  23:27 profile/
drwxr-xr-x   5 a1fm1001 student      512  5月 14日  22:27 src/
drwxr-xr-x   5 a1fm1001 student      512  5月 31日  23:37 tex/
drwxr-xr-x   8 a1fm1001 student      512  9月  1日  23:02 tmp/
$

このように、同じコマンドを使用する場合で、 その動作方法を変更するための指定を一般に オプションと呼ぶ。 各コマンドによっても異なるが、 複数のオプションや引数を同時に指定することも可能であり、 引数の指定と同様に空白で区切って指定するが、 オプションと引数を同時に指定する場合には、 引数より前にオプションを指定しなければならないことが多い。 例えば、ホームディレクトリ上のサブディレクトリprofileの 詳細な情報を確認する場合、lsコマンドを以下のように実行する。

$ ls -l profile/
ls -l profile
合計 1626
drwxr-xr-x   5 a1fm1001 faculty      512  5月  7日  20:24 Application Data/
drwxr-xr-x   2 a1fm1001 faculty      512  5月  8日  23:27 Cookies/
drwxr-xr-x   3 a1fm1001 faculty      512  4月 26日  01:10 Favorites/
drwxr-xr-x   5 a1fm1001 faculty      512  4月 26日  01:10 My Documents/
-rwxr--r--   1 a1fm1001 faculty   811008  5月  9日  00:29 NTUSER.DAT*
drwxr-xr-x   2 a1fm1001 faculty      512  4月 26日  01:10 NetHood/
drwxr-xr-x   2 a1fm1001 faculty      512  4月 26日  01:10 PrintHood/
drwxr-xr-x   2 a1fm1001 faculty      512  4月 26日  01:10 Recent/
drwxr-xr-x   2 a1fm1001 faculty      512  5月  8日  23:27 SendTo/
drwxr-xr-x   2 a1fm1001 faculty      512  4月 26日  01:10 Templates/
-rwxr--r--   1 a1fm1001 faculty     1024  5月  9日  00:29 ntuser.dat.LOG*
-rw-r--r--   1 a1fm1001 faculty      270  5月  8日  23:27 ntuser.ini
drwxr-xr-x   3 a1fm1001 faculty      512  4月 13日  16:35 スタート メニュー/
drwxr-xr-x   2 a1fm1001 faculty      512  5月  8日  23:27 デスクトップ/
$

□ コマンドとパスの補完

入力文字列の補完

bashによるコマンドライン操作では、 実行しようとするコマンド名の入力において TABキーを押すことにより、 そのコマンド名を補完したり、 また、候補となるコマンド名の一覧を確認することができる。 例えば、dateコマンドを入力しようとして、 以下のように「dat」の部分を入力した後に TABキーを押したとする。

$ datTAB

すると、この場合、この時に実行可能なコマンドの中で 始めに入力された「dat」の部分に一致する候補には dateコマンドしかないため、 以下のように残りの入力の「e」が自動的に補完される。

$ date

また、以下のように「da」まで入力して TABキーを押したとする。

$ daTAB

この場合、入力された文字列「da」と一致するコマンドは 複数あるため、1回だけTABキーを押しただけでは 何も起こらない。 この場合には、以下のように、 もう1度TABキーを押すとよい。

$ daTABTAB
すると、以下のように候補となるコマンドの一覧が表示されるので、 目的とするコマンドの入力の参考とすることができる。
$ daTABTAB
daps  date
$ da

また、コマンドの引数としてファイルやディレクトリのパスを指定する場合、 コマンド名の補完と同様に これらファイルやディレクトリのパスの補完を行うことができる。 パスの補完の場合、入力中の文字列と一致する絶対パス、 もしくは相対パスが候補となる。 例えば、ホームディレクトリ上にprofileというディレクトリが存在し、 以下のようにcdコマンドの引数として「p」を入力した後に TABキーを押したとする。

$ cd pTAB

すると、以下のように残りの「rofile」と これがディレクトリであることを示す「/」の部分が補完される (cdコマンドやlsコマンド等で ディレクトリを指定する場合、 ディレクトリ名の後ろに「/」を付けても付けなくてもよい)。

$ cd profile/

もし、ホームディレクトリ上に 「p」で始まるファイルやディレクトリとして、 profilepublic_htmlの2つのディレクトリがあったとする。 この場合に「p」を入力した場合、 以下のようにTABキーを2回押すことにより、 一致する候補一覧を確認することができる。

$ mkdir public_html
$ cd pTABTAB
profile      public_html
$ cd p

そこで、以下のように「p」に続けて「r」を入力し、 TABキーを押すとよい。

$ cd prTAB

すると、以下のように、残りの「ofile/」が補完される。

$ cd profile/

このようにコマンド名やパスを補完することにより、 長いコマンドやファイル名などの入力の手間を省くことができるだけでなく、 タイプミスなどを減らすことができ、便利である。

パスの展開

コマンドの引数としてパスを指定する場合、 パスそのものを指定する代わりに、 正規表現によるパターンを指定することができる。 この場合、指定されたパターンは、その正規表現に一致する全てのパスに展開され、 コマンドの引数としては、展開されたパス全てを指定したことになる。

例えば、「*」は任意の長さの文字列と一致し、 ホームディレクトリ上に 「p」で始まるディレクトリやファイルとして profileおよびpublic_htmlの2つのディレクトリがある場合に、 以下のように「p*」を引数としてlsコマンドを実行すると、 「p*」は「profile」および「public_html」に 展開され、lsコマンドの引数として指定される。

$ ls p*
profile:
Application Data/   NTUSER.DAT*         SendTo/             スタート メニュー/
Cookies/            NetHood/            Templates/          デスクトップ/
Favorites/          PrintHood/          ntuser.dat.LOG*
My Documents/       Recent/             ntuser.ini

public_html:
$

パスに展開されるパターンとしては、 表1に示す正規表現を利用することができる。

表1: パスに展開される正規表現のパターン
正規表現展開
* 任意の長さの文字列
? 任意の1文字
[<文字1><文字2>...] <文字1><文字2>...の中の任意の1文字
[<文字1>-<文字2>] <文字1>から<文字2>までの中の任意の1文字

□ 標準入出力

標準入出力の種類

catコマンドは、 以下のようにファイル名としての引数を指定しないで実行されると、 キーボードから入力された内容を1行ごとに画面に出力する (入力を終了するには、Ctrlキーを押しながら dキーを押す)。

$ cat
Hello.Enter
Hello.
How are you?Enter
How are you?
$

また、以下のように存在しないファイル名を指定して catコマンドを実行すると、 エラーメッセージが画面に出力される。

$ cat no-file
cat: no-file をオープンできません。
$

このように、コマンドによっては、キーボードからのデータ入力を要求するものや、 実行結果やエラーメッセージを画面へ出力するものがあるが、 一般に、コマンドなどのプロセスの入出力には、 UNIXシステムで提供される標準入出力が利用される。 この標準入出力には、図7に示すように、 「標準入力」、「標準出力」、「標準エラー出力」の3種類があり、 0番、1番、2番の番号がふられ、 一般に、それぞれ、キーボードからの入力、端末画面への出力、 同じく端末画面への出力に割り当てられている。 ここで、画面への出力が、標準出力と標準エラー出力に分けられているのは、 後で述べるリダイレクションなどを利用することにより、 コマンドの実行結果と、エラーメッセージを それぞれを分けて処理できることによる。

図7: 標準入出力の種類
リダイレクション

コマンドの実行結果などをファイルに保存したい場合や、 コマンドへの入力内容を予めファイルに保存しておき、 コマンド実行時にキーボードから入力する代わりに ファイルから読み込ませたい場合がある。 このような場合、リダイレクションを利用する。 例えば、ホームディレクトリ上のファイルやサブディレクトリの詳細な一覧を ファイルに保存する場合、 lsコマンドを以下のように実行する。

$ ls -al > sample/ls.out
$

すると、画面には何も表示されず、次のプロンプトが表示される。 ここで、以下のようにサブディレクトリsample上の ファイル一覧を確認すると、 ls.outという新しいファイルが作成されていることがわかる。

$ ls sample
ls.out
$

このls.outの内容を確認すると、 以下のようにls -alを実行した結果が このファイルに保存されていることが確認できる。

$ cat sample/ls.out
合計 18
drwx------  20 a1fm1001 faculty     1024  9月  7日  20:17 Mail/
drwxr-xr-x  10 a1fm1001 faculty     1024  9月  4日  13:44 doc/
drwx--x--x  13 a1fm1001 faculty      512  5月  8日  23:27 profile/
drwxr-xr-x   5 a1fm1001 faculty      512  5月 31日  23:37 tex/
drwxr-xr-x   8 a1fm1001 faculty      512  9月  6日  16:13 tmp/
$

このように、標準入出力の入力元や出力先をファイルに変更することを リダイレクションと呼ぶ。 標準入出力のリダイレクションを行なうには、表1に示すように、 コマンドの後ろ(オプションや引数がる場合には、その後ろ)に、 それぞれ、 標準入力の入力元をキーボードからファイルに変更する場合には 「<」、 標準出力の出力先を画面からファイルに変更する場合には 「>」、 標準出力からの出力をファイルへ追加する場合には 「>」、 標準エラー出力の出力先をファイルに変更する場合には 「2>」に続けて出力先のファイルを指定する。

表2: リダイレクションの指定方法
標準入出力書式
 標準入力 <コマンド>  [<オプション> ... ] [<引数> ... ]   < <ファイル>
 標準出力 <コマンド>  [<オプション> ... ] [<引数> ... ]   > <ファイル>
 標準出力の追加 <コマンド>  [<オプション> ... ] [<引数> ... ]   >> <ファイル>
 標準エラー出力  <コマンド>  [<オプション> ... ] [<引数> ... ]   2> <ファイル>

複数のリダイレクションを組み合わせて利用することもできる。 例えば、以下のように標準入力としてファイルから読み込んだ内容を処理し、 出力結果を別のファイルに保存することができる (注: catコマンドでファイルの内容を確認する場合、 「cat -n sample/ls.out」のように ファイルパスを引数として指定すればよいが、 ここでは標準入力の確認のために、 あえてリダイレクションを利用している)。

$ cat -n < sample/ls.out > sample/ls.out.numbered
$ cat sample/ls.out.numbered
     1  合計 18
     2  drwx------  20 a1fm1001 faculty     1024  9月  7日  20:17 Mail/
     3  drwxr-xr-x  10 a1fm1001 faculty     1024  9月  4日  13:44 doc/
     4  drwx--x--x  13 a1fm1001 faculty      512  5月  8日  23:27 profile/
     5  drwxr-xr-x   5 a1fm1001 faculty      512  5月 31日  23:37 tex/
     6  drwxr-xr-x   8 a1fm1001 faculty      512  9月  6日  16:13 tmp/
$
パイプ

先の例のようにlsコマンドの実行結果に catコマンドにより行番号をふった例のように、 何らかのコマンドの実行結果を別のコマンドにより処理したい場合がある。 このような場合、リダイレクションを利用してファイルに保存し、 これを別のコマンドで読み込んで処理してもよいが、 最初のコマンドの出力を次のコマンドで直接処理できると便利である。 このような処理を実現するために、UNIXシステムでは、 パイプと呼ばれる機能を提供している。

パイプは、図8に示すように、 最初のコマンドの標準出力と次のコマンドの標準入力とを接続する。 これにより最初のコマンドの実行結果として標準出力に出力される内容を 次のコマンドが標準入力からの入力として読み込むことが可能になる。

図8: パイプによる標準出力と標準入力の接続

パイプを利用して2つのコマンドを接続し、実行する場合、 2つのコマンドの間に挟んで、「|」を記述する。 例えば、ls -lの実行結果にcat -nで行番号をふりたい場合、 以下のように実行する。

$ ls -l | cat -n
     1  合計 18
     2  drwx------  20 a1fm1001 faculty     1024  9月  7日  20:17 Mail/
     3  drwxr-xr-x  10 a1fm1001 faculty     1024  9月  4日  13:44 doc/
     4  drwx--x--x  13 a1fm1001 faculty      512  5月  8日  23:27 profile/
     5  drwxr-xr-x   5 a1fm1001 faculty      512  5月 31日  23:37 tex/
     6  drwxr-xr-x   8 a1fm1001 faculty      512  9月  6日  16:13 tmp/
$

□ オンラインマニュアル

UNIXシステムでは多数のコマンドが用意されており、 必要に応じてこれらのコマンドを組み合わせて利用する。 また、各コマンドごとに、様々なオプションや利用方法がある。 このような多数のコマンドの多様な利用方法を知っていれば、 UNIXシステムを活用することができるが、 これら全てを覚えておくのは無理といえる。 しかしながら、UNIXシステムでは、これらのコマンドや、 そのUNIXシステムで提供される機能のほとんどに対して オンラインマニュアルが用意されており (ただし、日本語のマニュアルが用意されているものは限られており、 残りは英文のマニュアルとなる)、 コマンド名さえ覚えておけば、 必要に応じてそのオンラインマニュアルを調べ、利用することができる。

UNIXシステムでオンラインマニュアルを利用するには、 manコマンドを利用する。 例えば、lsコマンドの利用方法を調べたい場合には、 以下のように、manコマンドの引数としてlsを実行する。

$ man ls

すると、以下のようにlsコマンドのオンラインマニュアルが moreコマンドを通した形で表示される。 マニュアルを読み進めるためには、 moreコマンドの操作を行えばよい。

マニュアルを清書中です。しばらくお待ちください... 終了

ユーザーコマンド                                            ls(1)

【NAME】
     ls - ディレクトリの内容を一覧表示

【SYNOPSIS】
     /usr/bin/ls [ -aAbcCdfFgilLmnopqrRstux1 ]  [ file ... ]

     /usr/xpg4/bin/ls [ -aAbcCdfFgilLmnopqrRstux1 ]  [ file ... ]

【機能説明】
     file オペランドがディレクトリの場合、ls は、そのディレクトリ
     の 内 容を出力します。file が通常ファイルの場合、ls は、その
     ファイル名と要求された他の情報を出力します。デフォルトでは、
     アルファベット順にソートして出力します。引数をまったく指定し
     ないと、現在のディレクトリの内容を出力します。引数を複数指定
     す る と、引数は最初に適切にソートされますが、ファイル引数が
     ディレクトリとその内容より先に処理されます。

     出力形式には、主に 3 種類あります。端末に対するデフォルト の
     出力形式は、複数カラムで、ソートしたエントリを縦方向に並べて
-- 継続 --(5%)

調べたい内容によっては、同じ名称のコマンドやライブラリがあり、 これらが複数のセクションに用意されていて、 どれを表示してよいかわからない場合がある。 このときには、調べたい対象がコマンドであれば、 1番のセクションに格納されているため、 manコマンドのセクションを指定するためのオプションである -sを利用し、セクション番号を指定する。 例えば、pwdコマンドの利用法を調べようと思い、 以下のようにmanコマンドを実行しても、 演習用UNIXシステムでは意図した結果を得ることができない。

$ man pwd                # これではダメ

この場合、以下のようにセクション番号を指定し、 manコマンドを実行することにより、 目的のマニュアルを参照することができる。

$ man -s 1 pwd

レポート課題

■ レポート課題1

(1)

lsコマンドを-lオプションをつけて実行した際に、 第1カラムに表示されるdrwxなどの記号は、 アクセス権などの属性を示している。 これらの記号の意味をオンラインマニュアルを用いて調べ、簡潔にまとめよ。

(2)

ファイルやディレクトリのアクセス権を変更するコマンドに chmodコマンドがある。 chmodコマンドの利用方法をオンラインマニュアルで調べた上で、 ホームディレクトリ上に、各種ドキュメントを保存するためのディレクトリとして、 ディレクトリ名が「doc」であるサブディレクトリを作成せよ。 次に、docのサブディレクトリとして、 個人用ファイルなどを保存するためのディレクトリ「private」を作成し、 自分以外の利用者からはそのディレクトリ上にアクセスできず (ディレクトリ上のファイル一覧を参照できない)、 またファイルの読み取りや作成、削除などもできないよう、 アクセス権を設定せよ。

レポートには、アクセス権設定のためのchmodコマンドの実行手順と、 ホームディレクトリ上でls -l docを実行した結果を示せ。

■ レポート課題2

(1)

標準出力に指定した文字列を出力するコマンドとして echoコマンドがある。 echoコマンドを利用し、 ローマ字で記述した自分の名前を 「my_profile.txt」のファイル名でファイルに保存せよ。 レポートには、ファイルの作成手順と、 作成したファイルの内容を示せ。

(2)

次に、自分の趣味を「My hoby is 」に続けて英語で記述した内容を (1)で作成したファイルにechoコマンドを利用して追加せよ。 レポートには、ファイルへの追加手順と、 作成したファイルの内容を示せ。

(3)

(2)で作成したファイルにcatコマンドを利用して行番号をつけ、 「numbered_my_profile.txt」のファイル名でファイルに保存せよ。 レポートには、ファイルへの保存手順と、 作成したファイルの内容を示せ。

■ レポート課題3

(1)

UNIXシステムはマルチタスクオペレーティングシステムであり、 1つのシステム上で複数のプログラムがプロセスとして稼動しており、 現在稼動中のプロセスを確認するためのコマンドとしてpsコマンドがある。 psコマンドの利用法を調べ、 現在(その時点でよい)稼動中のプロセスがいくつあるか求めよ。 レポートには、プロセス数の確認手順と、稼動中のプロセス数を示せ。 なお、プロセス数を確認する方法としては、 画面に表示された全プロセスを数え上げる方法もあるが、 他の手法により(半)自動でその個数を求めよ。

(2)

演習用UNIXサーバでは、webサービスを提供するデーモンプロセスである、 httpdプロセスが稼動している。 httpdプロセスを実行している(架空の)利用者は、 どのようなユーザIDか、その確認手法とともに示せ。

■ レポート課題4

(1)

UNIXシステムはマルチユーザオペレーティングシステムであり、 1つのシステムに複数の利用者がログインして利用することができ、 その利用者を確認するためのコマンドとしてfingerコマンドがある。 fingerコマンドの利用方法を調べ、 現在ログインしている利用者のユーザID(ログイン名)と正式な氏名を確認し、 確認手順とともに示せ。

(2)

fingerコマンドでは、 個々の利用者のより詳細な情報を確認する方法がある。 これを利用し、自分の正式な氏名、ホームディレクトリ、ログインシェルが どのようにシステムに登録されているかを確認し、確認手順ともに示せ。

参考書籍、Web

  1. 山口 和紀 他監修: 「新 The UNIX Super Text【上】」, 技術評論社, ISBN4-7741-1682-3, ¥3,480-
  2. 慶応大学SFC CNSガイド編集委員会 編集: 慶応大学SFC CNSガイド 第3部 UNIXの操作

Last modified: Tue Oct 14 17:37:01 JST 2003