第 3 回 (2002.04.26) -- 基本コマンド,ファイルシステム,ファイル操作

基本コマンド

ここでは,unix システムで基本的に良く使われるがカリキュラムの構成上他の項目に含めにくいコマンドを挙げ, その扱いに簡単に触れておく.
# 時間に余裕があるならじっくり各々のコマンドを解説して良いのだが…

clear
画面クリア. ^L で代用できることも多い.
date
日付と時刻の表示、設定.
cal
カレンダー.
bc
計算言語.
例えば,階乗(factorial) n! を f(n) と定義して計算したい,という場合は…

    > bc -l
      bc 1.06
      Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
      This is free software with ABSOLUTELY NO WARRANTY.
      For details type `warranty'.

      define f(n) {
        z = 1;
        for ( i=1; i<=n ; i++) {
          z = (z*i);
          };
        return (z);
        }    

      f(1)
      1

      f(3)
      6

      f(10)
      3628800

      quit         ← ^d でも代用できる.
      
という具合いである.
script
端末上に表示した全てのログ(写し)をとる.
unix 管理者の基本コマンドの一つ. 作業記録を残したいときは非常に便利である.
普通のユーザにとっても便利である. 例えば宿題をやる時… とマニュアルにもある(^-^).
lpr
(ファイルを)印刷する.
a2ps
テキストファイルを Postscript ファイルに変換する. unix マシンに繋がっているプリンタは Postscipt プリンタであることが多いので, これはテキストファイルを印刷可能形式に変換する,ということを意味する.
banner
ともかくマニュアルを見て試してみる(^-^).
lynx
文字端末用 web ブラウザ.
教育用計算機システムではそのままでは外の web が見られないので,次 のようにして proxy を設定する必要がある.
方法その1
システム管理人に頼んで,/etc/lynx.cfg の http_proxy の項目を
http_proxy:http://proxyserver:3128/
https_proxy:http://proxyserver:3128/

などと修正してもらう.
方法その2
/etc/lynx.cfg をホームディレクトリにコピー.
さらにそれの該当部分を上記のように修正.
で,lynx の起動時に,
lynx -cfg=~/lynx.cfg URL
とする.
方法その3
一番お手軽で効果の高い方法だろう.
(sh系シェルの場合) export http_proxy=http://proxyserver:3128/
(csh系シェルの場合) setenv http_proxy http://proxyserver:3128/
として環境変数を設定する. 毎回これを設定するのは面倒なので,初期設定にいれておく(詳しくは後述).
通常は.bashrc に書込むだけでよい. ただし,アクセス方法によっては bash ではなくて sh だと認識されるので,
cd ~; ln -s ./.bash_profile ./.profile
として sh モードでも認識させるようにしておく.
w3m
lynx と同様に,文字端末用の web browser. 表組みをきちんと理解して表示するなどの点で lynx よりも高機能.
教育用計算機システムでは,w3m に対しては proxy がシステムできちんと設定されている. よって何も設定せずにすぐ使える.

ファイルシステム -- その構造

unix では(蓄積)データの取り扱い方法として, 原則としてたった一種類の形式のファイルとディレクトリからなる階層的ファイルシステムを用いている.
さらに,ディレクトリの階層構造を完全な一本の木構造(ツリー構造)とすることで, システムの全体構造を普遍的なものにすることにも成功している.
ファイルシステム構造のこのシンプルさと統一性は unix のファイルシステムの大きな特徴である.

ファイル
unix でのデータを物理的媒体に記憶するときの単位,というかデータの塊. ユーザからは名前のついたデータそのもののように見える. unix では基本的に一種類しかない.
→ ファイルに関するコマンド群の種類が一種類で済む.
ディレクトリ
ユーザから見たとき,unix でファイルを入れておく場所,もしくは箱のような単位. 住所,と思っても良いかもしれない. ディレクトリの中にはファイルも入れられるし,ディクレトリも入れられる. MS-windows で言うフォルダ.
本当はファイル名を管理するファイルのことだが…
木構造
tree-structure sample 数学でいうグラフ理論の単語から(^-^).
といっても,別に難しい話じゃなくて, 節と枝だけからなる図形(グラフ)の一種で, ある節から他の節へ枝を通っていく行き方が必ず一通りあって, かつ,その一通りしかない,というものをグラフ理論では「木」と言い, そうした構造を木構造という.
unix のファイルシステム全体を,

ディレクトリ = 枝わかれするときの節,
ファイル = 葉,
「箱(ディレクトリ) → 入ってる物(ファイル,ディレクトリ)」の矢印 = (向き付きの)枝,

としてグラフにすると, まさにこの構造になる.
これは偶然ではなく,これから示すようにいろいろ便利なのである.
ルートディレクトリ(root directory)
ファイルシステムを木構造で描いてみたとき,一番上に来るディレクトリをいう. これは,木構造を引っくり返してみると,そこが根(ルート)にあたることからそういう.
このディレクトリは unix 上では / という記号で表される.

下のパスの「起点」の一つとなる場所である. (木構造の原理から言えば,どこが起点になってもよい. ただ,どこが中心かといえばここだろう,ということだ.)
カレントディレクトリ(current directory)
unix ではいかなる作業をするにも,いかなるソフトウェアが動作するにも, 「動作しているその瞬間にいる場所=ディレクトリ」が存在する. われわれが cui で作業する時は,われわれの命令を待ち受けているシェルがどこで動作しているか, ということである.
この「現在作業をしているディレクトリ」をカレントディレクトリという.
パス(path)
image - graph - path ファイルシステムを木構造で描いてみると,どのファイルもどこかの 「葉 = 末端の節」になっている. よって,木構造の性質から,ルートディレクトリからそのファイルまでの道筋(path)は一通りしかないはずである.
そこで,そのファイルがどこにあるかを指定する方法として, 「どこかからの道筋」を用いることにして,それをパス名(path name)と呼ぶ.
ディレクトリとディレクトリ(ファイル)との間を区切る記号として / を用いる.

# 本当は「枝」がディレクトリやファイルにあたるんだが,慣れないとグラフの枝を実体として扱うことに混乱するのでこう描いている.

# シェルがコマンドを探すための領域を指定しておく環境変数 PATH へも繋がる話なのでよく理解すべし.
絶対パス
パス名の起点としてルートディレクトリを用いる方法. よって,必ず先頭に / がつく.
相対パス
パス名の起点としてカレントディレクトリを用いる方法. 先頭に / がついてない場合は必ずこれという決まりになっている.
絶対パスと相対パスの違いは初心者はよく混乱するので,注意すること.
親ディレクトリ,(自ディレクトリ)
どのディレクトリにも入っている特別なディレクトリが二つある. それは

.. → 親ディレクトリへの入り口. 親ディレクトリとは,自分が含まれる一段階大きなディレクトリのこと.

. → 自分ディレクトリ自身. 様々な技術的理由から存在する. 最も多い使われ方は,そのディレクトリにあるファイルを「確実に」 指定したい時に使うというものである. 例えば,そのディレクトリに hoge というファイルがあるとしたら, ./hoge と指定すれば,それはそのディレクトリにあるファイルが確実に指定されたことになる.
マウント
ある媒体のルートディレクトリを全体のファイルシステムのどこかのディレクトリと同一視することによって, 全体のファイルシステムの中に他のファイルシステムを組込むことをいう. 設定ファイルは /etc/fstab などにあるので,これと man mount を併せて見るとなんとなくわかるだろう.

… って書くと難しいが,絵でかくと簡単だ. 授業で示そう.

ファイルシステム -- ファイル保護機構

unix ではマルチユーザシステムの為の機能の一つとして ファイルシステムにファイル保護機構が組込まれている. これはファイルやディレクトリにユーザによって対応が異なることを示す「属性」 を与えるという方法で実現されている.
この機構は柔軟であり,かつユーザ自身で制御できる. この機構を適切に用いることによって,同じシステムを用いる他ユーザから 自らの秘密データを守りつつ,時にデータ交換等を行なうことができる.
また,unix には様々な特権レベルのユーザを作成することができるが, その特権を設定するのは実はこのファイルシステムの保護機能を用いる.

ファイル所有者
ファイルの属性の一つ. そのファイルの所有者(user)が誰か,を表す.
ls -l で3つめに出てくる要素として見られる(OS によって異なるかも).
ファイル(アクセス)グループ
ファイルの属性の一つ. そのファイルの所有者がどのグループ(group)の立場でそのファイルを所有しているか,を表す.
ls -l で4つめに出てくる要素として見られる(OS によって異なるかも).

# ファイルのアクセス権限をグループで指定できる,と簡単にとらえた方がわかりやすいか.
ファイルモード → permission
初心者にとってまず最初にかなりややこしいと思うところ(^-^). (まあ,難しい部分は抜きにして)
ファイルモードの一部分が「ファイル操作の許可情報(permission)」を表す. この情報を適切に設定しておけば,ファイルの保護ができるのである.
具体的には,ls -l で一番左に出る項目がこの permission 情報を表している.

[ls -l の左端の項目の読み方]
r: 読出し可能.
w: 書込み可能.
x: 実行可能(ディレクトリの場合,探索可能).

ここは分かりにくいだろうから,例を示そう. 例えば,

    > ls -l  
    > -rw-------   1 paoon  Labo      6665   3 26 22:45 dummy1
    > -rw-r-----   1 paoon  Labo     50102   4  5 22:19 dummy2
      
となっているとする. これの意味するところは, ということである. 後述するコマンド chmod を使えば,この属性を書き換えられるので, 自分のファイルの保護レベルを自由に設定できることがわかるだろう.

ファイル操作

通常ファイル操作

pwd
現在いるディレクトリ(カレントディレクトリ)を示す.
cd (Change Directory)
カレントディレクトリを変更する.
pushd
カレントディレクトリを変更する. ただし,それまでのカレントディレクトリを記憶してくれるので,次の popd と組み合わせると便利である.
popd
pushd で記憶したディレクトリへ戻る.
ls
ディレクトリの内容をリスト表示する. 最も良く使うコマンドの一つなので,適切なオプションを alias で指定しておくようにするのがコツ.
mv
ファイル(ディレクトリ)を移動させる.
rm
ファイル(ディレクトリ)を消去する. unix では消去したデータは元に戻らないため, 安全のためにオプション -i などを alias しておくのが望ましい.
ln
リンクを張る. ハードリンクとシンボリックリンクがあるが, 通常はシンボリックリンクしか使わない. よって,シンボリックリンクを意味する ln -s がデフォルトと言ってよい.
シンボリックリンクの意味は,
シンボリックリンク = ファイルの別名 = windows での「ショートカット」
である.
mkdir
ディレクトリを作る.
rmdir
ディレクトリを消去する.
cat
ファイルの内容表示(本来は違う意味だが…).
more
ファイルの内容表示. モニタでの表示に便利な機能がいくつかついている.
less
ファイルの内容表示. more よりもさらに便利.
wc
ファイルのサイズ,単語数,行数を表示.
du
ディスク使用統計の表示. 自分はどれくらいディスクを使っているのかな〜 なんていう時に便利.
nkf
漢字コード変換コマンド.
tar
(テープ)ファイルアーカイバ. テープという部分は現在ではユーザにはあまり意味はないだろう. 数多くのファイルをまとめて一つのファイルとして「書庫(arhive)」に入れる, という動作の為のコマンド.
windows/dos では似たような目的のためのツールとして, zip や lha などが知られている.
ただし,tar にはファイル圧縮機能は無い.
whatis
apropos の厳密版. apropos はなんだったかというと?
which
コマンドプログラムがどこにあるか,を教える. ただし,パス変数の中からしか探さない.
whereis
コマンドに限らず,様々な種類のファイルを探し出す. ファイルの種類はオプションで指定.
find
ディレクトリの木構造を下へ下へと下がっていきながらファイルを探して, 処理を行なう.
例えば,カレントディレクトリ(.) よりも下のディレクトリで ファイル名の終りが .txt であるファイルを探したい,というときは
find . -name '*.txt' -print
となる.
/ なんかで似たようなことをやるとひどい目にあうのでよく考えてから実行すること(^-^).
file
ファイルの種類を判定する. ファイルの中身に触れる事なく判定できるので,安全だ(^-^).
diff
(テキスト)ファイルの違いを表示する. ちょっとだけ違うはずのファイルがどこが違うかを知るのに便利.

ファイル保護機構に関する操作

ls -l
ファイルの詳細情報を表示. これで通常はパーミッション情報が見えるはず.
chmod
ファイルのパーミッションを変更する.
umask
ファイルが作成されるときのパーミッションのデフォルト値を決める. ただし,マスク値なので,初心者は混乱しやすいか…

課題

  1. bc を使って,1 から 1000 まで足した時の答えを求めよ.
  2. lpr で命令した印刷があるが,プリンタが故障したためこの印刷を取り消したい. こういう時にはどのようなコマンドを用いればよいか.
  3. lynx を用いてこの web にアクセスしてみよ. さらに,カラーが常に使われるように設定し,その設定方法を記せ.
  4. script を使って作業記録をとる練習として, script を用いた状態で (テンポラリな)ディレクトリを作って,中を覗いてみて,そのディレクトリを消す, という一連の動作を行なえ. その際の記録を報告せよ.
  5. umask の使い方を調べて例をいくつか挙げて解説せよ.
  6. chmod を使って,次のようなファイルを作れ(テキストファイルでよい).
    誰にでも読み書き,実行できる.
    誰にでも読め,実行できるが,書込めない.
    自分だけが読み書き,実行できる.
    自分でも読めるだけ.
  7. 上の問いで出てきたパーミッション設定はファイルに対してであった. 同じパーミッション情報が「ディレクトリ」に与えられていた場合, それは各々どのような意味になるか,答えよ.