Unix C プログラミング入門資料(高崎金久)     1章(Unixシステムの使い方の基礎)からの抜粋 目次 1.ログイン・ログアウト・パスワード 2.Unixの階層的ファイルシステム 3.ファイル操作の基本的コマンド 4.パイプ,リダイレクション,グルーピング 5.mule の使い方 ------------------------------------------------------------------------- 1.ログイン・ログアウト・パスワード Unixシステムを利用する場合,最初に計算機にユーザ名とパスワードを入力し てログインします.ユーザ名はユーザ登録時に決められるものですが,パスワード はユーザが自由に変更できます.(むしろ安全のためときどき変更するのが望まし い.) ログインの手順は使用するシステムの設定によって異なります.各自確認して下さ い. パスワードの変更はいったんログインしてから "yppasswd" というコマンドで行い ます.このコマンドを入力すると,システムは古いパスワードと新しいパスワード を順に尋ねますので,キーボードから入力します.最後に確認のため新しいパスワ ードをもう一度入力するように言ってきます.さきほど入力した新しいパスワード 文字列と同じであれば,変更手続きが終了します.   注意:パスワードのネットワーク管理をしていない場合には "passwd" という   コマンドでパスワードを変更します."yppasswd" はネットワークを介してユ   ーザー情報を一括管理するシステム(NIS)でパスワード管理情報を変更を   するためのコマンドです. パスワードの管理は基本的にユーザの責任です.他人に教えたりすることは論外で すが,他人が推測しやすいパスワードを避けたり,時々変更したりするなどの工夫 をして下さい. 計算機を使い終えたらかならずログアウトして下さい.ログアウトの手順もシステ ムの設定によって異なりますので,かならず確認しておいて下さい.ログアウトで きたら,あとは静かに立ち去って下さい. 2.Unixの階層的ファイルシステム Unixシステムではデータやプログラムをファイルという形で保存します(これ はほかの多くの計算機システムでも同様です).さらに.たくさんのファイルを関 連のあるものに分けて階層的に整理するために,ディレクトリという構造が用意さ れています(この考え方は今では他の多くの計算機システムに採用されていますが, もともとはUnixから来たものです). 1)ファイル名,ディレクトリ名の指定の仕方 Unixのファイル・ディレクトリの名前のつけ方にはとくに制限がありません. (MS−DOSや昔のWindowsのように,8文字+3文字の拡張子という形 をとることは要求されません.)長さは255文字以内で,英数字・記号が使えま す. "WWW/index.html" は現在いるディレクトリの下の"WWW"というディレクトリ(この ようなディレクトリをサブディレクトリといいます)のなかの"index.html"という ファイルを指します."WWW"がさらにサブディレクトリ"icons"をもつときにはそれ を"WWW/icons"で指定できます.そのなかのファイル"kuma.xbm"は"WWW/icons/kuma.xbm" というように指定できます.図式的に表わせば次のようになります(左から右へと ディレクトリ階層を降りて行く). ... ----- ... (files in the present working directory) |--- ... |--- ... |--- WWW (directory) ----- index.html (file) | |--- icons (directory) --- kuma.xbm (file) このように,ディレクトリ名を"/"で区切ることによってディレクトリの階層を下 へ下へとたどって行くことができます.このように,ファイル名とそこへ至るディ レクトリの階層名を組にしたものをファイルのパス名といいます. 特別なディレクトリ名として "." と ".." があります. "." --- 現在いるディレクトリ ".." --- その一つ上のディレクトリ 今説明したのは正確にいえば「相対パス名」と呼ばれるものです.これは現在いる ディレクトリから見たパス名を表わします.これに対して,ファイルシステム全体 での位置を指定するものを「絶対パス名」といいます.一つのUnixシステムで はルートディレクトリを頂点としてすべてのディレクトリが木構造(普通の木と違 って根=ルートを上にする)をなしています.ルートディレクトリは "/" で指定 されます.絶対パス名はこのルートディレクトリからのパス名を表わすもので,先 頭に"/" をつけて "/usr/local/bin/mule" というように指定します. 2)pwd コマンド (print working directory) cd コマンド (change directory) "pwd" は現在いるディレクトリの絶対パス名を表示するコマンドです. ディレクトリの移動に使うのは "cd" コマンドです."cd" の後にディレクトリ名 をつけることでそのディレクトリに移動します. [例]cd .. (一つ上のディレクトリへ移動する) [例]cd / (ルートディレクトリへ移動する) [例]cd /usr/local/bin (/usr/local/bin へ移動する) [例]cd (ホームディレクトリへ戻る) 3)mkdir コマンド(ディレクトリの作成) rmdir コマンド(ディレクトリの削除) これは文字どおりの意味をもつコマンドです(mkdir = make directory, rmdir = remove directory).自分で新たにディレクトリを作ったり,すでにあるディレク トリを消したりするのに使います. [例]mkdir samples (samples という名前のディレクトリを作る) [例]rmdir samples (samples という名前のディレクトリを削除する) 4)ls コマンド(ファイルのリストを表示する) "ls" はファイルを一覧表示するコマンドです.MS−DOSの "dir" に相当する コマンドですが,それよりも豊富な機能をもっています.それらの機能はオプショ ンにより引き出されます.いくつか例を示します.実際にどのように働くか,各自 試してみてください.これらのオプションは組み合わせて使うことができます. [例] ls -F (ファイル名のあとにそのファイルの種類を示す記号を付ける) [例] ls -l (ファイル名だけでなく,ファイルについての詳しい情報も表示) [例] ls -a (".login" など,"." で始まるファイルも表示する) [例]ls -la ("l"オプションと"a"オプションの組み合わせ) [例]ls -l *.c ("l"オプションで".c" で終わるファイルすべてを表示) [例]ls WWW/*.html ("WWW"というサブディレクトリ中の".html"で終わる    ファイルすべてを表示) [例]ls -F / ("F"オプションで"/" というディレクトリの内容を表示) [例]ls .. ("F"オプションで一つ上のディレクトリのないようを表示) 5)ファイルの保護モード Unixのファイルやディレクトリには保護モードと呼ばれる情報が付随してい ます.保護モードは ls -l で各行の左側に表示されます.たとえば drwxr-xr-x ... takasaki staff (中略)... ... ... oldsamples -rwxr-xr-x ... takasaki staff (中略)... ... ... a.out -rw-r--r-- ... takasaki staff (中略)... ... ... sample.c -rw-r--r-- ... takasaki staff (中略)... ... ... sample.doc という具合に表示されたとします.このとき左端1桁目のデータはディレクトリ であるか否かを表わします. [1桁目]"d":ディレクトリ "-":ファイル [2ー4桁]ファイルの所有者(上の例では takasaki)に対する保護モード [5ー7桁]所勇者のグループに(上の例では staff)対する保護モード [8ー10桁]その他のユーザーに対する保護モード r, w, x はファイルに対する操作を表わします. [操作]"r":読み取り(read) "w":書き込み(write) "x":実行(execute) 保護モードの各桁にこれが書き込まれている場合にはその操作が該当するユーザー に許されていることを意味します.上の例では "sample.c", "sample.doc" はとも に rw-r--r-- という保護モードをもっていますが,これは所有者が読み書きでき て,他のユーザーが読むことのみ許されていることを意味します.これに対して "a.out" の保護モードは rwxr-xr-x となっていますが,これはいずれのユーザー にも実行が許されていることを意味します. 3.ファイル操作の基本的コマンド ここではファイルを取り扱うための基本的なコマンドを説明します. 1)cat コマンド(ファイルの内容の表示など) file (ファイルの種類を表示) more (ファイルの内容を表示,1画面ずつ区切って表示) less (ファイルの内容を表示,逆スクロール可能) view (ファイルの内容を表示,いろいろな機能がある) cat は本来は複数のファイルを連結(conCATenate)して画面に表示するコマンド で,単一のファイルに対して使えば単にその内容を表示します. [例]cat .login (".login"というファイルを表示する) これはいわゆるテキストファイル(文章として読めるファイル)に対してのみ実行 してください.そうでないファイル(いわゆるバイナリファイル)に対して実行す ると画面に意味不明の文字が表示されたり画面自体が乱れておかしくなります. 実際には,長いファイルに対して cat コマンドを実行すると,ファイルの最後まで 画面に流れてしまうので,読みとれません.その意味で cat コマンドはファイルを 読むためのものではありません. ファイルを読むためにはmore, less, view などのコマンドを使います.これらは 画面に収まる行数だけ表示し,"f", "b" などの内部コマンドでスクロールします. 使い方については,オンラインマニュアルや参考書を見てください. file コマンドはファイルの種類を判別するためのコマンドです. [例]file .login (これはテキストファイルだが,シェルスクリプトという 種類のものなので,その旨の応答がある) [例]file /usr/local/bin/tcsh (これはバイナリファイルである) 3)cp コマンド(ファイルのコピー) mv コマンド(ファイル名の変更) rm コマンド(ファイルの削除) これらは読んで字のごとしです(cp = copy, mv = move, rm = remove).複数の ファイルを一度に扱うこともできます.以下に使い方の例を示します. [例]cp sample.doc sample1.doc("sample.doc" というファイルのコピーを 作り "sample1.doc" と名付ける) [例]cp sample*.doc samples/ ("sample*.doc" というファイル群を"samples" というディレクトリにコピーする) [例]mv sample.doc sample.bak("sampel.doc" というファイルを "sample.bak" という名前に変更する) [例]mv sample*.doc samples/ ("sample*.doc" をディレクトリ sample に移動) [例]rm sample.bak("sample.bak" というファイルを削除する) [例]rm *.bak ("*.bak" というファイル群をすべて削除する) [例]mv samples oldsamples  この場合の動作は "oldsamples" というディレクトリがすでにあるか否かで  違ってきます.  1."oldsamples" というディレクトリが存在しないときには,"samples"  を"oldsamples" という名前に変える  2."oldsamples" というディレクトリが存在するときには,"sample"は  "oldsampels" のサブディレクトリ "oldsamples/samples" に移動する. 4)diff コマンド(ファイルの相違を調べる) "diff file1 file2" というように2つのファイルを与えるとその相違を表示しま す.いろいろなオプションがあります. 5)head コマンド(ファイルの先頭の何行かを表示する) tail コマンド(ファイルの末尾の何行かを表示する) 6)grep, egrep, fgrep (ファイル中の文字列パターンの検索) [例]grep "" *.c ("*.c" というファイル群のなかから "" という文字列の現われる箇所を探し出す) [例]ps -e | grep "mule" ("ps -e" は現在動いているプロセスをすべて表示 するコマンド.これをパイプで grep に渡し,そのなかから "mule" という文字 列を拾い出す.) 7)wc コマンド(ファイルの行数,語数,文字数を表示) 8)spell コマンド(英文ファイルの単語のスペルミスを調べる) このほかにもファイル処理のコマンドはいろいろあります.特に,Unixではパ イプラインの途中で「フィルター」として使うコマンド(むしろツールという言い 方のほうがふさわしい)がよく用いられます. 4.パイプ,リダイレクション,グルーピング パイプ(あるいはパイプライン)とリダイレクトについてはすでにいくつかの例で 出てきましたが,Unixシステムの大きな特徴なので,ここで改めて説明してお きます.また,複数のコマンドをまとめて入力する方法についても併せて触れます. 1)パイプ Unixシステムではさまざまなコマンドやソフトウェアを組み合わせて使うこと が容易にできるようになっています.それを実現する仕組の一つがパイプです. ls -l と less を組み合わせた "ls -l | less" を例にとって説明してみましょう. ls -l はファイルのリストを画面に表示します.この画面というのは本当は「標準 出力」と呼ばれます.これに対して less は(ファイル名をless file1 というよ うに指定しないで)単独で呼び出せば,入力を「標準入力」から取り込みます.こ の標準入力はキーボードのことです.標準出力を標準入力にそのままつなげられれ ば ls の出力を less でスクロールして読めるわけですが,その働きをするのが "|" という記号です. ls -l ---> standard output :::::: standard input ---> less "pipeline" cat は単独で使えば入力先が標準入力,出力先が標準出力となります.Unixの コマンドやソフトにはこのように標準入力から入力して標準出力へ出力するものが たくさんあります(cat を初めとして,head,tail,tr,sort,uniq,sed,awk など). このようなものをフィルターということがあります.ちょうど本物のフィルター (ろ過器)のように,入力に一定の処理を行ってそのまま送り出すという働きをす るからです.このようなフィルターはパイプで次々つないで使えるように設計され ているわけです. [例]ls -l | sort -nr +3 | cat -n | less (ファイルのリストをファイルの 大きさの順に並べ替えて行番号をつけて less で読む.cat をフィルターとして 使うのはこのように行番号をつけるオプション -n を利用する場合が多い.) 2)リダイレクション 次にリダイレクトですが,これは標準入力や標準出力を入出力先とするコマンドに 対して,入出力先を強制的に指定ファイルなどへ切り替えさせるものです.次のよ うにいくつかの種類があります(実はこれ以外に標準エラー出力という出力の出力 先を切り替えるリダイレクトもあるのですが,ややこしくなるので,とりあえず次 のものだけ覚えてください.) > file1 出力先を"file1"に切り替える(*) >> file1 同じだが,"file1"の末尾に追加する < file1 入力先を"file1"に切り替える  (*)ユーザーの環境設定によって動作が変わります.すでに"file1"という  ファイルがある場合にはその旨メッセージがでて処理が中断されるかも知れま  せん.そのときには"file1"というファイルをいったん消して再度実行してく  ださい. [例]ls -l > filelist (ファイルのリストを"filelist""というファイルに 書き込む) [例]sort < file1 | uniq > file2 ("file1"のすべての行を一定の順序に 並べ変えて,重複があれば取り除いてから,"file2"に書き出す) [例]cat file1 | spell | sort | uniq > texterr(英文のファイル "file1" の中でスペルミスの疑いのある単語を "texterr" に書き出す) 3)複数コマンドのグルーピング いくつかのコマンドをまとめて1行で指定するには,コマンドの間をコロン ";" で結びます. [例]xbiff &; mule & ; kterm & (xbiff,mule,kterm をバックグラウンドで 順次起動する) 5.mule の使い方 1)起動の方法 mule の起動の方法は大きく分けて2通りあります.   *[ウィンドウメニューやアイコンによる起動]起動用のウィンドウメニュー   やデスクトップアイコンが用意されていれば,それを利用できます.   *[コマンドによる起動]コマンドによる起動の仕方は何通りかあります.   オプションについてはオンラインマニュアルや参考書で調べてください.   [例]mule &(新たにウィンドウを開く形で起動する)   [例]mule file1 file2 ... &(起動と同時にファイルをいくつか読み込む)   [例]mule -nw (端末ウィンドウの中で起動する)   [例]mulw -nw file1 file2 ... (端末ウィンドウの中で起動,ファイルを   読み込む) 2)終了の方法  *C-x C-c:まだ保存していない文章をどうするか確認しながら終了     記号の説明:C-x (コントロール x)は ctrl キーと x キーを     同時に押すことを意味します.これに対して,M-x(メタ x)は     esc キーを叩いて(押し続けてはならない)から x キーを押す     ことを意味します.     C-x C-c は C-x に引き続いて C-c を入力することを意味します. C-x C-c を実行すると,"Save buffer (yes or no)? " というようなメッセージが 表示されます.buffer とは mule のなかの文章編集用のウィンドウの一つ一つを さす言葉です.yes と答えれば簡単ですが,no と答えると,"1 modified buffer exists. Do you really want to exit ? (yes or no)" (”本当に保存しないで終 了していいのか?”)と確認しているので,今度は no と答えてやっと終了します. 3)基本的編集コマンド これはたくさんあるのですが,とりあえず次を覚えて下さい.コマンドの右の括弧 内は英語での意味です)  *C-x C-f (find file)   編集文書をファイル名(新規ファイル名でもよい)を指定して開く  *C-x C-r (read file)   編集文書をファイル名を指定して read only(編集しない)モードで開く  *C-x C-s (save to file)   編集文書をファイルに保存,編集続行  *C-x C-w (write to file) 編集文書を別名のファイルに書き込み,そのファイル名で編集続行  *C-i (insert from file) ファイルからカーソルの位置に読み込む  *C-f (forward-char) カーソルを右へ1文字移動  *C-b (backward-char) カーソルを左へ1文字移動  *C-p (previous line) カーソルを一つ前の行へ戻す  *C-n (next line) カーソルを一つ後の行へ進める  *C-a (begining of line) カーソルを行の初めに移動  *C-e (end of line) カーソルを行の終りに移動  *C-v (scrole up) 1画面進める  *M-v (scrole down) 1画面戻す  *M-< (jump to begining of buffer) 編集文書の最初に飛ぶ  *M-> (jump to endof bufer) 編集文書の最後に飛ぶ  *C-d (delete-char) カーソル下の文字を消す  *C-h または backspace カーソルの前の文字を消す  *C-k (kill line) カーソルの右側を行末まで消す  *C-k C-k カーソルの右側を行末まで消し,行末コードも消す  *C-y (paste from yank) Cーk で消した内容をカーソル位置に書き出す  *C-g (quit commands) コマンドの実行を中断 なお,mule のウィンドウの上端からメニューが引き出せます.そこからも同様の 編集コマンドが選べます.メニューには編集以外にもいろいろな項目があります. 4)ウィンドウの分割  *C-x 2 ウィンドウを2つに分割する  *C-x 1 カーソルのあるウィンドウだけを表示する ファイルを編集中に C-x でウィンドウを2つに分けると,別れたウィンドウには 同じファイルが表示されます.それぞれは別々に動かしたり編集したりできます. ただしあくまで同じバッファとして編集します.これにより,1つのバッファの違 う場所を同時に見比べながら読んだり編集したりできます.これはたいへん便利な ことです. 5)チュートリアル  *C-h T (tutorial) 自習用のメニューを起動する  下段のミニバッファに "Language:" と表示されるので,  "Language: Japanese" と入力すると,日本語のチュートリアルが始まる 説明にしたがって操作して行くと段階的に練習が進むようになっています. 6)"egg" による日本語入力 mule には egg と呼ばれる日本語入力の機能が組み込まれています.  *C-\ egg の起動・終了 (起動時には左下隅の[ ]が[あ]と変わる) あとはローマ字入力を行い,space(スペースキー)を押して変換をして行きます.  *space 次の候補    *C-p 前の候補  *M-s 大文節候補一覧(候補間の移動 C-b,C-f 選択 return)  *M-z 小文節候補一覧(候補間の移動 C-b,C-f 選択 return) 文節間の移動:  *C-f 次の文節   C-b 前の文節 文節の分け方の変更:  *C-o 大文節を延ばす  C-i 大文節を縮める  *M-o 小文節を延ばす  M-i 小文節を縮める なお,カタカナの入力は C-i を繰り返し適用することで行います. このほかにもいろいろなコマンドがありますが,とりあえず以上のことで何とかな ります.