Unix C プログラミング入門資料(高崎金久)   1.Unixシステムの使い方の基礎 目次 1.はじめに 2.ログイン・パスワード 3.ウィンドウシステム 4.ログアウト 5.Unixの階層的ファイルシステム 6.ファイル操作の基本的コマンド 7.パイプ,リダイレクション,グルーピング 8.ファイル操作以外の基本的コマンド 9.さまざまな道具類 -------------------------------------------------------------------------- 1.はじめに この演習ではUnixシステムを利用してCプログラミングの基礎を学びます.当 然,Unixシステムやそれが提供するさまざまなサービス・道具類についてある 程度の知識をもつ必要があります.そこで,この資料ではUnix一般について基 本的なことを説明し,必要な箇所でこの演習室特有の事情について説明します. UnixシステムはMacや最近のWindowsとはかなり勝手が違うところが 多いので,Unixシステムに初めて触れる人は(計算機をかなり使い慣れていて も)これから説明することをしっかり理解するように努めてください. Unixシステムについて本格的に勉強したい人には 「Unix SuperText」(上・下巻)(技術評論社) をお薦めします.これでたいていのことは分かります.(ただし,内容的に少し古 くなったところもあります.)上巻は一般ユーザー向け,下巻はプログラマーや管 理者を目指す人向けになっています.ただし上下巻あわせてかなりの価格(と重量) になります. Unix上のさまざまな道具について個別に解説した本もいろいろ市販されていま すので,そういうものを読んでみるのもよいでしょう. 2.ログイン・パスワード Unixシステムを利用する場合,最初に計算機にユーザ名とパスワードを入力し てログインします.ユーザ名はユーザ登録時に決められるものですが,パスワード はユーザが自由に変更できます.(むしろ安全のためときどき変更するのが望まし い.) パスワードの変更はいったんログインしてから "yppasswd" というコマンドで行い ます.このコマンドを入力すると,システムは古いパスワードと新しいパスワード を順に尋ねますので,キーボードから入力します.最後に確認のため新しいパスワ ードをもう一度入力するように言ってきます.さきほど入力した新しいパスワード 文字列と同じであれば,変更手続きが終了します.   注意:パスワードのネットワーク管理をしていない場合には "passwd" という   コマンドでパスワードを変更しますが,この部屋では使わないでください.こ   の部屋でのユーザーのパスワード情報はネットワークを介して特定の機械   (NISサーバー)で一括管理しています."yppasswd"はそのNISサーバの   パスワード管理情報を変更をするコマンドです. パスワードの管理は基本的にユーザの責任です.よくある失敗は,パスワードの変 更をしているときに変な文字を入力してしまって,あとでログインできなくなる, というものです.変更中に backspace, delete キーで前の文字(見えませんが) を消すことも変な文字の入力と解釈されることがあります.どうしてもログインで きなくなったら一般ユーザーでは解決できませんので,管理者や教官に申し出てく ださい.決して他人のパスワードを借りるなどのことをしないでください.(ルー ル違反です.)悪意を持つ人にパスワードを知られたり破られたりした場合,その ユーザーだけでなくシステム全体が被害を被る可能性があります. パスワードについて守るべき主なこと:   *人に知らせたり知られたり貸したりしてはならない(当り前)   *できるだけアルファベットと数字を混ぜる(最近のシステムではそれを強制    されることが多い)   *意味のある文字列や他人が用意に想像できる文字列を避ける(パスワード破    りのソフトは辞書に出てくる単語を片っ端から試す)   *すばやくタイプできる文字列を選ぶ(あまりに複雑だと遅くなりがち)   *他の人がパスワードを入力しているところをのぞき込まない(礼儀作法)   *冗談にでも(もちろん本気でも)他の人のパスワードを破ろうとしてはいけ    ない(冗談にならない) 3.ウィンドウシステム この部屋のワークステーションではGUI(graphical user interface)の一種で ある「Xウィンドウシステム」が動いています.ログインに成功すると画面にこま ごまとした図形ややもっと大きな四角の領域が表示されます.小さい図形は「アイ コン」と呼ばれ,カーソルを合わせてボタンをクリックすることでソフトを起動し たりできます.大きい四角の領域はちょうど壁に開いた窓のように見えます.その ため「ウィンドウ」とよばれます. ログイン直後に開いた一番大きなウィンドウには "kamo %" などという文字列が表 示され,そこでUnixのコマンドを入力したり,出力が表示されたりします.こ のウインドウは文字情報を入出力するもので,ここにキーボードを使ってコマンド などを入力すると,その結果やメッセージなどがやはり文字で表示されます.これ はGUI以前の計算機の利用環境を模倣したものなので,端末エミュレータと呼ば れることがあります.これから行うCプログラミングの演習はおもにこの文字ベー スの環境を扱います.   *Windowsでは「コマンドプロンプト」がこの端末エミュレータに相   当します.コマンドプロンプトはWindowsの前に用いられていた文字   ベースのパソコン用オペレーティングシステム「MS−DOS」の実行環境   を模倣するものです.以下の説明で「MS−DOSでは」というときにはコ   マンドプロンプトでの実行環境のことを指すと解釈してください. 端末エミュレータのウィンドウは自分で新しく開くことができます.これには二通 りの方法があります:   *[ウィンドウメニューやアイコンによる起動]起動用のウィンドウメニュー   やデスクトップアイコンが用意されていれば,それを利用できます.   *[コマンドによる起動]あいている端末ウィンドウに入ってウィンドウ   を開くコマンドをバックグラウンド(& をつける)で実行する.   たとえば kterm のウィンドウを開くには "kterm &" というコマンドを実行   する.その他の端末ウィンドウも同じ.フォントの大きさやウィンドウの大   きさなどはオプションをつけることで指定できる.オプションについての詳   細は参考書やオンラインメニューで調べること. ウィンドウを操作する(移動,サイズ変更,アイコン化,閉じる,など)にはいろ いろなやり方があります.一番簡単なのはウィンドウの枠についているアイコンを 利用することです.詳細はウィンドウを管理している管理プログラム(ウィンドウ マネージャーという)によって違います.この部屋のウィンドウシステムは Motif 系で,次のように操作できるはずです.   *左上角の小さい四角の部分にカーソルを合わせて左ボタンを1回クリック   すると,ウィンドウとウィンドウ操作のメニューがでる.それを選ぶことで   いろいろな操作ができる.(メニューの項目の選び方はルートウィンドウメ   ニューの場合と同じ.)   *同じ四角の部分を1回クリックする代わりに2回素早くクリックすると直   接ウィンドウを閉じることができる.(これはWindowsの場合とよく   似ている.)   *ウィンドウ枠の上部にカーソルを合わせ,左ボタンを押さえたままマウス   を動かすとウィンドウ全体が移動する.適当なところでボタンを話すとそこ   で固定される.   *ウィンドウの右上にある2つのボタンをクリックするとウィンドウを画   面いっぱいに拡げたりアイコンに畳んだりすることができる.   *ウィンドウの角の部分にカーソルを合わせるとカーソルの形が変わる.こ   こで左ボタンを押さえたままマウスを移動するとウィンドウの大きさを変え   られる.適当なところでボタンを話すとそこで固定される. アイコン化されたウィンドウは   *カーソルを合わせて左ボタンを押しながらマウスを動かすと移動する.   *カーソルを合わせて左ボタンを素早く2回押すと元の大きさに戻る. 新たに開いたウィンドウはほかのウィンドウと同じように使えます.ただし,ログ アウトできるのは最初に開いたログインウィンドウだけからです. ルートメニューには,エディターやWebブラウザーを起動するメニューなどもあ ります.ただし,慣れてくれば,いちいちマウスに手をやるよりも直接コマンドで 起動する方が楽になります.細かいオプションをつけて起動するためにはコマンド で起動する必要があります. ウィンドウをいくつか開いて作業を分散して行うことにすれば,同時にいろいろな 仕事を効率よく処理して行くことができます.少し時間のかかる処理をこちらのウ ィンドウでやらせておいて,あちらのウィンドウで別のことをやる,という具合で す.しかし,演習の様子を見ていると,中には,意味もなく多数のウィンドウを開 いて実際には全然使っていない,という人も見受けられます.(実は閉じ方や移動 の仕方がわからなくてどんどん開いてしまった,という情けない事例もあります.) ウィンドウを一つ開くということはそれだけで計算機の資源をある程度使います. 仕事の仕方は各人各様でいいのですが,あまり無駄の多いやり方は感心できません. 4.ログアウト 終わり方も大切です.(計算機の操作全般に言えることですが,何か始めるときに は,終了の方法をあらかじめ知っておかなければなりません.)終了(ログアウト) は   *ウィンドウの外でどちらかのマウスボタンを押すとメニュー(ルートメ    ニュー)がでる.そのなかに「終了(quit)」の項目があればそれを選ぶ    (ないこともある)   *ログイン直後に自動的に開いた一番おおきなウィンドウ("login" など    のタイトルがついているはず)に入って, "logout" コマンドを入力する などの方法で行います.ログアウトできたら,あとは静かに立ち去って下さい.         このとき決して計算機の電源を切ったり            リセットスイッチを押したりしては            なりません! ここがMacやWindowsパソコンとの大きな違いです.またメディアセンタ ーの機械ではログアウト後 "shutdown" コマンドを実行して機械を止めることにな っていますが,この部屋ではそれは必要ありません(そもそもできません). Unixシステムではいきなり電源を切ったりリセットしたりすると)重要なデー タが失われ,システム自体が壊れたりすることすらあります.安全にシステムを停 止するには一定の手順(shutdown)が必要ですが,通常それはシステム管理者しか できないようになっています. 5.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) このように,ディレクトリ名を"/"で区切ることによってディレクトリの階層を下 へ下へとたどって行くことができます.(MS−DOSやWindowsではディ レクトリの区切り記号は"\"でした.)このように,ファイル名とそこへ至るディ レクトリの階層名を組にしたものをファイルのパス名といいます. 特別なディレクトリ名として "." と ".." があります. "." --- 現在いるディレクトリ ".." --- その一つ上のディレクトリ 今説明したのは正確にいえば「相対パス名」と呼ばれるものです.これは現在いる ディレクトリから見たパス名を表わします.これに対して,ファイルシステム全体 での位置を指定するものを「絶対パス名」といいます.一つのUnixシステムで はルートディレクトリを頂点としてすべてのディレクトリが木構造(普通の木と違 って根=ルートを上にする)をなしています.ルートディレクトリは "/" で指定 されます.従って "ls -F /" はルートディレクトリの様子を表示します.(やっ て見てください.何がありますか?) 絶対パス名はこのルートディレクトリからのパス名を表わすもので,先頭に"/" を つけて,たとえば "/usr/local/bin/mule" というように指定します.この例では / --- usr --- local --- bin --- mule というように,ルートディレクトリから3階降りたところのディレクトリのなかの "mule" というファイルを表わします. なお,ファイルやディレクトリを指定してコマンドを呼び出す場合,ファイルとデ ィレクトリには見かけ上の区別がつきません.これはファイルとディレクトリをあ らかじめ区別しなくてよい場合には便利ですが,区別しなければならない場合には 困ります.事実,同じコマンドでも対象がファイルである場合とディレクトリであ る場合で動作が違うことがあります.そのために起こるミスを少しでも防ぐ対策と して,ディレクトリ名の最後にはかならず"/"をつけるようにする(それでディレ クトリであることが明示されます)ということを薦めます.たとえば /usr/local/bin ---> /usr/local/bin/ という具合です. 2)pwd コマンド (print working directory) cd コマンド (change directory) "pwd" は現在いるディレクトリの絶対パス名を表示するコマンドです.(実行して みて下さい.)ログインした後でこれを実行して出てくるのがユーザのホームディ レクトリです.ここからディレクトリを移動してみましょう. ディレクトリの移動に使うのは "cd" コマンドです."cd" の後にディレクトリ名 をつけることでそのディレクトリに移動します. [例]cd .. (一つ上のディレクトリへ移動する) [例]cd / (ルートディレクトリへ移動する) [例]cd /usr/local/bin (/usr/local/bin へ移動する) [例]cd (ホームディレクトリへ戻る) 最後の例のように,単に "cd" とすると自分のホームディレクトリへ戻ります. あちこち移動してどこにいるかわからなくなったら "pwd" で位置を確認できます. 3)mkdir コマンド(ディレクトリの作成) rmdir コマンド(ディレクトリの削除) これは文字どおりの意味をもつコマンドです(mkdir = make directory, rmdir = remove directory).MS−DOSでも同じコマンド(ただし md, rd と省略でき た)がありました.自分で新たにディレクトリを作ったり,すでにあるディレクト リを消したりするのに使います.使い方は簡単です. [例]mkdir samples (samples という名前のディレクトリを作る) [例]rmdir samples (samples という名前のディレクトリを削除する) ディレクトリのなかにファイルが残っていると注意を促すメッセージが出て,削除 は行われません.(ファイルを消すコマンドについてはあとで説明します.) 4)ls コマンド(ファイルのリストを表示する) "ls" はファイルを一覧表示するコマンドです.MS−DOSの "dir" に相当する コマンドですが,それよりも豊富な機能をもっています.それらの機能はオプショ ンにより引き出されます.いくつか例を示します.実際にどのように働くか,各自 試してみてください. [例] ls -F (ファイル名のあとにそのファイルの種類を示す記号を付ける) [たとえばディレクトリには "/",実行可能ファイルには "*" がつきます.その ほかにもいくつか特別な意味をもつ記号があります.実行可能ファイルについて は追々説明します.] [例] ls -l (ファイル名だけでなく,ファイルについての詳しい情報も表示) [ファイルについての情報とは,ファイルの種類・保護モード,ファイルの所有者・ 所有グループ,ファイルの大きさ,作成(更新)日付,ファイル名などです.これ が各ファイルごとに1行ずつ表示されます.これらの情報はたいへん重要な意味を もっているのであとで少し説明しますが,詳細は説明しきれません.参考書などで 調べてください.] [例] ls -a (".login" など,"." で始まるファイルも表示する) ["." で始まるファイル名のファイルは各ユーザーのホームディレクトリ(ログイ ンのあと最初に入るディレクトリ)に置かれ,ユーザーごとの環境設定のために用 いられます.これらのファイルは単なる ls では見えませんが,このオプションで 表示されるようになります.(つまり普段は意識しなくてよいものです.)ユーザ ー登録後初めてログインしたときにもすでにいくつかの "." ファイルがホームディ レクトリにおいてあるはずですが,これはシステム管理者が用意してくれたもので す.これらはユーザーが自分用に自由に変更して構わないものですが,Unixシ ステムについて理解が深まるまでは下手にいじらない方が無難です.詳しくはやは り参考書で調べて下さい.] なお,これらのオプションは組み合わせて使うことができます. [例]ls -la ("l"オプションと"a"オプションの組み合わせ) これらのコマンドのあとにファイル名やディレクトリ名を指定することもできます. [例]ls -l *.c ("l"オプションで".c" で終わるファイルすべてを表示) [例]ls WWW/*.html ("WWW"というサブディレクトリ中の".html"で終わる    ファイルすべてを表示) [例]ls -F / ("F"オプションで"/" というディレクトリの内容を表示) [例]ls .. ("F"オプションで一つ上のディレクトリのないようを表示) "*"は任意の文字列(空の文字列も含む)を表わします.たとえば "ex*.c"は "ex" で始まり".c"で終わるファイルすべてを指します(ex1.c, ec2.c, ex2b.c, ex.c, etc).これと似ているもので "?" というものがありますが,これは任意の1文字 を表わします.たとえば "ex?.c" は ex1, ex2.c, ext.c などを表わしますが, ex2b.c, ex.c などは排除します.基本的にはMS−DOSや Windowsの ワイルドカードと同じですが,一つ違うのは,MS−DOSやWindowsで は "*x.c" が "*.c" と同じものとみなされる("*" のあとの "x" が無視される) のに対して,Unixでは区別されるということです. 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桁目から10桁目が保護モードを表わします.これらは3桁ずつに区切られ, それぞれファイルの所有者(上の例では takasaki),所有者の属するグループ (上の例では staff),それ例外のユーザーの3種類のユーザーに対してこの ファイルが許す操作を指定しています. [2ー4桁]所有者に対する保護モード [5ー7桁]所勇者のグループに対する保護モード [8ー10桁]その他のユーザーに対する保護モード 操作は3種類あります: [操作]"r":読み取り(read) "w":書き込み(write) "x":実行(execute) 保護モードの各桁にこれが書き込まれている場合にはその操作が該当するユーザー に許されていることを意味します.上の例では "sample.c", "sample.doc" はとも に rw-r--r-- という保護モードをもっていますが,これは所有者が読み書きでき て,他のユーザーが読むことのみ許されていることを意味します.これに対して "a.out" の保護モードは rwxr-xr-x となっていますが,これはいずれのユーザー にも実行が許されていることを意味します. "sample.c" というファイルがCプログラムのファイルでそれをコンパイラーで処 理して実行可能ファイル "a.out" ができたときにはちょうどこの例のような状態 になっています."sample.doc" はこのCプログラムに対する記録(ドキュメント) というところでしょうか. これからCプログラミングを学んで行く過程ではエディターやコンパイラーが自動 的にファイルの保護モードを設定してくれるので,保護モードについてあまり気に する必要はありませんが,次の章で学ぶシェルプログラミングではファイルの保護 モードを自分で変更する必要があります.ファイルの保護モードの変更は chmod コマンドで行いますが,詳細は参考書などを見てください. 6.ファイル操作の基本的コマンド ここでは個々のファイルを取り扱うための基本的なコマンドを説明します. 1)cat コマンド(ファイルの内容の表示など) file (ファイルの種類を表示) MS−DOSの "type" コマンドのような使い方ができるのがこの "cat" です. (ただし,"cat" の本当の使途はこれとは別のところにあります.)ファイル名 をつけて実行するとそのファイルの中味を画面に表示します. [例]cat .login (".login"というファイルを表示する) これはいわゆるテキストファイル(文章として読めるファイル)に対してのみ実行 してください.そうでないファイル(いわゆるバイナリファイル)に対して実行す ると画面に意味不明の文字が表示されたり画面自体が乱れておかしくなります. ".login", ".cshrc", ".emacs", ".xinitrc" などはテキストファイルです.また mule や vi などのエディターで作ったファイルも(普通に作れば)テキストファ イルです. テキストファイルであるかどうかは "file" コマンドで調べられることもあります. ただし最初のうちはその応答の意味を理解するのはむずかしいかも知れません.い ろいろ実験してみてください. [例]file .login (これはテキストファイルだが,シェルスクリプトという 種類のものなので,その旨の応答がある) [例]file /usr/local/bin/tcsh (これはバイナリファイルである) cat コマンドがただの表示コマンドではないことを示す例として,次のような使い 方があります. [例] % cat > sample.doc(このコマンドを実行して,カーソルが次の行へ移ったら) This is a test. (この行を入力して改行) My name is ... (ここで ctrl キーを押しながら D を押す) C-d (ここの応答はシステムによって若干異なる) これで新たに "sample.doc" というファイルができ,そこに "This is ... " の2 行が書き込まれています. 正しく書き込まれたかどうかは "cat sample.doc" で 確かめられます.(うまく行かない場合にはもう一度やり直せばよいですが,「フ ァイルがすでに存在する」などとシステムから文句を言われるかもしれません.そ のときにはあとで説明する "rm" コマンドで "sample.doc" を削除してからもう一 度やり直してください.) この例は cat コマンドをファイルの指定なしで呼び出しています.試しに "cat" だけを入力してみると,カーソルは次の行へ移り,入力を待っています.このとき なにか入力すると(最後に改行キーを押す)それがそのまま次の行に表示されて, また入力待ちの状態になります.(やめるには ctrl キーと D を同時に押す). このようにキーボードから入力して画面へ出力するというのが cat の基本動作な のです. 上の例の "cat sample.doc" のようにファイル名を与えて cat を呼び出すとファ イルの内容を見るだけならば,"more","less","view" などのコマンドの方が便利 です.cat コマンドではファイルの内容を一度に全部画面に出してしまうので,1 画面に収まるファイル以外は実際には読むことができません.(だから cat 単独 では実際にはファイルの内容を見るにはあまり役に立ちません.)それに対して "more", "less", "view" は一度に画面に表示できる行数ずつスクロールしてくれ ます. これらの使い方はそれぞれ違いますが,"more" と "less" の起動の仕方は同じで す.もともと "less" は "more" の機能不足(画面を逆スクロールできない)を 強化するものとして開発されました.以下にいくつか起動例を示します. [例]less sample.doc("sample.doc" の内容を画面に表示する) 起動後 "f" で1画面進め,"b" で1画面戻る."q" で終了.その他内部コマンド がいくつかあります.ただし,less をこのように単独で起動することは少なく, 以下の例のように,他のコマンドと組み合わせて使うのが普通です. [例]cat sample*.doc | less ("sample*.doc" で指定される複数のファイルを 連結して less で読む) この例では "sample*.doc" というファイル群を cat で連結し(cat コマンド本来 の使い方!),それを「パイプ」と呼ばれる仕組で less に送って表示させていま す.パイプの指定が "|" という記号です.この例では 前の cat の例と同様に lessを単独で起動しています.   注意:パイプについてはあとでまとめて説明します. 次の例では入力先が ls の出力(これも本来は画面)になっています. [例]ls -la | less(ls -l の出力を less で読む) "ls -la" の出力は1個のファイルの情報を1行に書き出すので,ファイルの数が 多いと1画面には収まりません.そこで出力をパイプ "|" を介して less に渡し て,前後にスクロールしながら読む,というのがこの例です. "view" というコマンドは実は vi エディタを読み込み専用モードで起動するもの なので,vi の内部コマンドがすべて使えて,たとえば高度な検索機能も利用でき ます.詳しくはオンラインマニュアルや参考書を見てください. 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" というディレクトリにコピーする) このコマンドを実行すると "sample*.doc"というファイル群のコピーが"samples" というディレクトリの中にできます.その前提として samples というディレクト リがすでに用意されていなければいけません.(そうでないと"samples"というフ ァイル --- なければ新たに作って --- に次々コピーすることになります.)そ のことを忘れないために,ディレクトリ名には必ずディレクトリで表わす記号"/" (ls -F で表示されることを思い出して下さい)を付けて cp samples*.doc samples/ というような呼び出し方をする習慣を身につけるとよいでしょう.(samples が ディレクトリとして用意されていない場合にはエラーメッセージが出ます.) [例]mv sample.doc sample.bak("sampel.doc" というファイルを "sample.bak" という名前に変更する) [例]mv sample*.doc samples ("sample*.doc" をディレクトリ sample に移動) この例でも前提として samples というディレクトリが用意されていないといけま せん.エラーを少しでも防ぐため cp の場合と同様にディレクトリ名に"/"を付け て mv sample*.doc samples/ という呼び出し方をするのがよいでしょう. [例]rm sample.bak("sample.bak" というファイルを削除する) [例]rm *.bak ("*.bak" というファイル群をすべて削除する) この形のコマンドは十分注意して使う必要があります.管理人がユーザーに対する 親切心から rm コマンドを「対話的」モードで呼び出すように設定している場合に は,上のコマンドを実行すると,個々のファイルについて削除するかどうかいちい ち聞いて来ます.これは面倒くさいことですが,ファイルの削除に当たってはこう いう慎重な態度が望ましいのです. rm コマンドにはこのほかに "-r" オプションというのがあり,これを使うとディ レクトリとそのなかのサブディレクトリ全部を一度に消すことができます.しか し,これもよほど確認してから実行しないと危険な使い方です. なお,mv コマンドはディレクトリ名の変更や移動にも使えます. [例]mv samples oldsamples この場合の動作は "oldsamples" というディレクトリがすでにあるか否かで違って きます.  1."oldsamples" というディレクトリが存在しないときには,"samples"  を"oldsamples" という名前に変える  2."oldsamples" というディレクトリが存在するときには,"sample"は  "oldsampels" のサブディレクトリ "oldsamples/samples" に移動する. このように2通りに解釈できるコマンドの使い方はミスを招きやすいので,後者の 場合には明示的に [例]mv samples oldsamples/samples ("samples" を "oldsamples" のサブディ レクトリ "samples" に移動する) というように実行する方がよいでしょう. なお以上のようにディレクトリを移動しても "samples" のなかのファイルやサブ ディレクトリはそのままの状態で残ります. 4)diff コマンド(ファイルの相違を調べる) "diff file1 file2" というように2つのファイルを与えるとその相違を表示しま す.いろいろなオプションがあります. 5)head コマンド(ファイルの先頭の何行かを表示する) tail コマンド(ファイルの末尾の何行かを表示する) [例]head file1 ("file1" というファイルの先頭を表示) [例]head -40 file1 ("-40" で先頭40行を表示するようになる) head,tail にも ファイル名を与えない cat のような使い方ができます. 6)grep, egrep, fgrep (ファイル中の文字列パターンの検索) [例]grep "" *.c ("*.c" というファイル群のなかから "" という文字列の現われる箇所を探し出す) [例]ps -e | grep "mule" ("ps -e" は現在動いているプロセスをすべて表示 するコマンド.これをパイプで grep に渡し,そのなかから "mule" という文字 列を拾い出す.) 検索文字列にはもっと複雑な設定が可能です. 7)wc コマンド(ファイルの行数,語数,文字数を表示) 8)spell コマンド(英文ファイルの単語のスペルミスを調べる) このほかにもファイル処理のコマンドはいろいろあります.特に,Unixではパ イプラインの途中で「フィルター」として使うコマンド(むしろツールという言い 方のほうがふさわしい)がよく用いられます. 7.パイプ,リダイレクション,グルーピング パイプ(あるいはパイプライン)とリダイレクトについてはすでにいくつかの例で 出てきましたが,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 をバックグラウンドで 順次起動する) さらに,コンマで結んだコマンド群を括弧 ( ) をくくって単一のコマンドとして 扱い,その標準出力をパイプでほかのコマンドの標準入力につなぐこともできます. [例](ls -l dir1 ; ls -l dir2) | less (2つのディレクトリの一覧を一緒 にして less で眺める) 8.ファイル操作以外の基本的コマンド Unixシステムにはファイル操作以外にもたくさんのコマンドがあります.以下 基本的なものだけを紹介します.詳細はオンラインマニュアルや参考書などに譲り ます. 1)man コマンド(オンラインマニュアル) システム自体やシステムで使えるコマンド・ソフトウェアの多くにはオンラインマ ニュアル(画面に表示される)が用意されています.Unix,あるいはUnix 上のソフトウェアといっても,そのシステムごとに微妙な違いがあります.その違 いを知るためのよい資料がこのオンラインマニュアルです.使い方は "man chmod" というように知りたいコマンド・ソフトウェアの名前をつけて呼び出します.ちな みに "man man" で man コマンド自体のオンラインマニュアルも出ます. 2)clear コマンド(画面の消去) 現在の端末画面を消去し,カーソルを左上隅にもどします.MS−DOSの cls コマンドに相当します. 3)date コマンド(現在の日付と時刻を表示) cal コマンド(カレンダーの表示) 説明するまでもないでしょう. 4)jobs コマンド(ユーザが現在起動しているコマンド・プロセスの表示) ps コマンド(現在起動しているコマンド・プロセスの表示) kill コマンド(プロセスの停止) プロセスの概念はUnixシステムを利用する上でファイルシステムとならんで 基本的なものですが,ここでは詳細を省きます.参考書などを見てください. "jobs" は現在自分が起動している主なコマンド・プロセスを表示するものです. 実行すると各プロセスに [1] ... [2] ... というような番号(job 番号とでもいうのでしょうか)がつけられて表示されます. また "ps" はシステム全体で起動中のプロセスを表示するもので,いろいろなオプ ションをつけて使用します.(このオプションはシステムによって相当違うことが あります.以下はこの部屋のシステムの場合の例です.) [例]ps -e |less (システムで起動中の全プロセスを表示.たいへん多いので, less で眺めている) [例]ps -u takasaki (ユーザー名 takasaki で起動している全プロセスを表示) ps コマンドで表示された情報のうちで特に大切なのはプロセスID(PID)と 呼ばれるもので,これは各プロセスに一意的に割り当てられた数です.("jobs" と "ps -u" を実行してみて,どれとどれが対応しているか調べて見てください.) たいていのプロセスは ctrl+c (ctrl キーと c を同時に押すことをよくこのよう に表現します)で止まりますが,起動したプロセスが異常を起こして止まらなくな った場合,そのプロセスを強制的に停止する必要があります.そのような場合に使 うのが kill コマンドで,job 番号またはプロセスIDを指定して実行します. [例]kill %n (n は数字で,jobs コマンドで表示される n 番目のプロセスを 停止する.たとえば[1] と表示されたプロセス %1 で指定する) [例]kill n(n は数字で,PID n のプロセスを停止する) [例]kill -9 n(プロセスによっては単なる "kill" では停止しないもの がある.その場合には,このように "kill-9" あるいは "kill -KILL" という コマンドを用いるとたいていは停止する.) プロセスに関するコマンドは他にもいろいろありますが,ここでは省略します. 5)lpr コマンド(ファイルを印刷するコマンド) lp コマンド(ファイルを印刷するコマンド) これはシステムの状況によって異なり,参考書通りに入力してもうまく行かないこ とがあります.実際の使い方はその場で説明しますので,それに従って下さい. 6)w コマンド(使用中のユーザーを表示) who コマンド(使用中のユーザーを表示) who の方が詳しい情報が表示されます.いずれもオプションがいろいろあります. 7)passwd コマンド(ローカルマシンでのパスワードの変更) yppasswd コマンド(NISでのパスワードの変更) すでに触れました.この部屋では後者を使ってください. 8)chsh コマンド(ログインシェルの変更コマンド) ypchsh コマンド(NISでのログイン変更コマンド) プロンプトマークを表示して入力を促したり,ユーザーからのコマンド入力を解釈 して実行したりしているのがシェルです.シェルには幾通りか用意されています. ログイン時に起動するシェル(ログインシェル)はパスワード情報の中に一緒に記 録されています.それを変更するのがこれらのコマンドです.NISでこれらの情 報を管理している場合には ypchsh をつかう必要があります. 9)ypcat コマンド(NISサーバーの管理情報を表示する) オプションをつけて使用します(オプションの例は単に "ypcat" と入力すると表 示されます.) [例]ypcat passwd | grep "Tanaka"(パスワード情報を取り出し,その中から "Tanaka" という文字列を拾い出す.結果として "Tanaka" という人のパスワー ド情報が取り出される.ただし,パスワードそのものは暗号化されている.) なお,暗号化されているとはいっても,パスワード情報は決して外部に出してはな りません.メールでだれかに伝える,など論外の行為です.暗号であるかぎり解読 される可能性があります. 10)!コマンド(すでに実行したコマンドの再度実行) これは文字や数字と組み合わせて用います. [例]!! (直前のコマンドを実行する) [例]!-n (n は数字で,n 個前のコマンドを実行する) [例]!n (n は数字で,ヒストリーリストの n 番目のコマンドを実行する) ここでヒストリーリストとは最近実行されたコマンドの一覧で,history コマンド により表示されます. 以上はほんの一部で,まだまだたくさん重要なコマンドやがあります.たとえば, alias コマンドはコマンドやコマンドの組み合わせに対して別名をつけるものです. うまく使えばたいへん便利です.find コマンドは複数のディレクトリに分散した ファイル群に対して一斉にある処理を行わせるものです.端末設定や環境変数・シ ェル変数関係のコマンドも大切です. 9.さまざまな道具類 実際に計算機システムを利用して行く上では,以上のようなコマンドに加えて,も う少し大がかりな道具類も必要になってきます.次のような道具はこれからどんど ん使って行くことになります. *メール,ネットワーク関係:説明するまでもないでしょう.ネットワーク関係で は ftp, telnet などが古典的なツールですが,最近はWWW(World Wide Web あ るいは単にWeb)関係のツールが重要になっています. *清書や作図の道具類:レポート,論文,ドキュメント類,OHP用資料,などを 作成するために欠かせません.TeX, tgif, gnuplot などいろいろあります. *プログラミングの道具:コンパイラー,デバッガー,リンクエディターなどが大 道具ですが,それ以外にさまざまな小道具もあります.もともとUnixシステム に本来備わっている小道具はもともとかなりの部分がこのようなプログラミングの 道具です. *エディター類:代表的なものは vi, emacs などです.vi はUnixシステム には必ず付随していて,システムの一部をなすとさえ言ってもよいような存在です. システム管理者を目指す人は vi をマスターする必要があります.(すでに述べた ように,view は vi を読み取り専用で起動するコマンドにほかなりません.emacs は日本語化された nemacs や多言語化された mule として使われることが多くなっ ています.emacs,nemacs, mule は vi と対照的に,編集以外のさまざまな機能 (メールやニュースの処理からプログラミングの支援に至る)を取り入れた総合的 環境を提供するのが特徴です. これからプログラミングの演習を進めて行くにあたって,エディターは欠かせない 道具なので,最後に標準的エディターである mule について基本的なことを説明し ておきます.詳しいことはここでは説明しきれませんので,mule のオンラインマ ニュアルや参考書を見たり,チュートリアル(C-h で起動)でまなんで下さい. 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 を繰り返し適用することで行います. このほかにもいろいろなコマンドがありますが,とりあえず以上のことで何とかな ります. 7)mh によるメールの送受信 mh (Mail Handler) を mule の中から呼び出してメールの送受信を行うことができ ます.機能が豊富で,メールをフォルダに分けて整理することもできますので,使 い慣れると便利です.以下に機能のごく一部を紹介します. なお,mh を利用するにはあらかじめホームディレクトリ内に .mh_profile という 設定ファイルを用意しておく必要がありますが,これはすでに管理者が作って置い てあるはずです. メールの受信  *M-x mh-rmail メールを取り込んでその一覧を表示する  到着したメールはいったん「inbox」という名前のフォルダに格納され,番号を付  けて一覧表示される.読みたいメールにカーソルをあわせて「.」(ピリオド)を  押すと,新しいウィンドウが開いてメールの内容が現われる.以下,この状態で  使えるコマンドを示す:    *「.」キー   メールの表示を最初の位置(From:...)に戻す    *「,」キー   メールをファイルの先頭から表示する    *スペースキー  本文をスクロール    *「backspace」 本文を逆スクロール    *「n」キー   次のメールに移る    *「p」キー   前のメールに戻る    *「j」キー   指定番号のメールに移る    *「d」キー   メールの消去(「D」という印が付く)    *「u」キー   消去を解除(「D」は「U」という印に変わる)    *「a」キー   メールの返事を書く    *「s」キー   メールを送信する    *「c」キー   メールを別のフォルダに複写する    *「^」キー   メールを別のフォルダに移動する    *「f」キー   メールを別のアドレスに転送する    *「x」キー   消去を実行して本文ウィンドウを閉じる    *「Esc」+「f」 別のフォルダの一覧を表示する    *「q」キー   mh-rmail の終了 メールの送信  *M-x mh-smail メールを送信する準備に入る  このコマンドを入力するとメールの送信先,cc の送信先,Subject を順に聞かれ  る.メールの編集画面に入ってから書くこともできるので,ここでは単にリター  ンキーを押してスキップしてもよい.それが終わるとメールの編集画面に移る.  (mh-rmail で「s」や「a」を押した場合も同じ.)  メールの編集画面では通常の編集画面と同様にメールを書けばよい.通常の編集  ウィンドウにはないメール送信専用のコマンドは以下の通り:    *C-c C-y  「a」で返事を書いている場合のみ使える.受信メールの内容          の複写を各行「名前>...」(「名前」は相手の名前)の形で          本文に挿入する.「名前」の部分をどうするか,最初に尋ね          てくる.    *C-c C-s  自分の Signature(ホームディレクトリの .signature という          ファイルに書き込んでおく)を挿入する.    *C-c C-c  メールを送信する 管理者が設定した状態では各メールフォルダはホームディレクトリの「Mail」とい うサブディレクトリ内に作られます.メールはメールフォルダ(Mail のサブディ レクトリ)の中に番号(1,2,...)をファイル名とするファイルとして保存されま す.「消去」されたメールも実際には先頭に「#」を付けた名前に変わる(#1,#2, ...)に変わるだけで,残っています.本当不要になったら通常のファイルと同様 に消して下さい. また,Mail ディレクトリ内の「aliases」というファイルに次のような形式でメー ルアドレスの alias を書き込んでおくと,mh-smail によるメールの送信の際には alias でアドレスを指定することができます.一つの alias に複数のアドレスを 割り当てることもできます. [alias ファイルの例] spock: mspock@enterprise.uss.movile taro: taro@ultrix.ultra.m78 seven: seven@ultrix.ultra.m78 king: king@ultrix.ultra.m78 ultras: taro@ultrix.ultra.m78,\ seven@ultrix.ultra.m78,\ king@ultrix.ultra.m78