1998 年度「計算機基礎論3B」 1998-11-20

タイピング練習

タイピング練習が最後まで終わっていない人は続けてください。 この実習の時間以外の、授業の空き時間などに集中的に練習するのもよいでしょう。 前回の最後に書いたように、第四実習室でも練習できます。 全部のキーの位置を手に覚えさせてしまえば今後の実習がずっと楽になります。

unix の参考書

unix の参考書としては,技術評論社の「The UNIX Super Text(上)(下)」が便利です。 しかし分厚くて結構高いです。

コマンド

WS で、unix のプロンプトが出ているところから打ち込んで (最後にEnter を打って)実行させるものを 「コマンド(command)」と呼びます。 例えば、すでにでてきた「ls」はコマンドです。 また、たとえばそこに ls と打って実行させることを 「コマンドラインから ls を実行した」 「コマンドラインに ls と打ち込んだ」 などということもあります。

「ls -la file1」のように、コマンド名のあとに何かがつく場合もあります。 それらを「引数(ひきすう)」と呼びます。 コマンド名と引数の間、引数と引数の間には一つ(以上)のスペースがはいります。

 ※ というか、スペースで区切られた最初の部分がコマンド名、 あとのひとつひとつが引数となるのだ。 このことは unix や MS-DOS をある程度以上使っていると当たり前に思えて、 前に「ls -la file1」とかを紹介するとき 「間にスペースをいれるように」というのを忘れてしまった。 しかしそんなことでは教師失格である。ごめんなさい。_o/|_ (←平身低頭を表わす文字絵。メールとかで時々見かける)

「-la」のように「-」で始まるものは「オプション(option)引数」であることが多いようです。 つまり、「同じ ls というコマンドなんだけど、ちょっと違う動きをしてほしい」 と命令するときにつけるものです。 それに対し、「file1」は ls に作用してほしい対象を指定しています。 このあとのタイプのものだけを引数と呼ぶこともあるかもしれません。

コマンドの中には、実行中に Ctrl+C で中止できるものがあります。 また、コマンドを打っている途中で一行全部やり直したくなったときも Ctrl+C を押します。 Ctrl+S は実行を一時中断します。再開は Ctrl+Q です。

 ※ これらの実験はすぐ終わってしまうコマンドではできません。 「ls -la /var/mail」でやってみたらどうかな。 でも後者はタイミングが結構むずかしいかも。:-)

パス

コマンドも、実はファイルです。 たとえば ls の“正体”は /usr/bin/ls です。 だから、コマンドラインに絶対パス指定つきで「/usr/bin/ls」 と打ち込んで実行させることもできますが、 「ls」だけでも実行できます。 どうして「ls」だけで /usr/bin/ls が実行されるのでしょう? そのしかけは、環境変数 path にあります。 「環境変数」についてのくわしい説明はここではしませんが、 set は定義されている環境変数すべてを表示させるコマンドです。

    ws47{eb00d48}1% set
    argv    ()
    cdpath  (. /home/kakuma/iwase/eb00d48)
    cwd     /home/kakuma/iwase/eb00d48
    filec
    home    /home/kakuma/iwase/eb00d48
    mtfpath (/opt/FSUNmtf/bin /usr/openwin/bin /usr/openwin/bin/xview)
    openwinpath     /usr/openwin/bin
    path    (/usr/bin /usr/sbin /usr/ccs/bin /usr/ucb /opt/SUNWspro/bin /opt/FSUNf90
    /bin /opt/FSUNnqs/bin /opt/FSUNvppwb/bin /usr/local/bin /usr/openwin/bin /home/c
    enter/fjh/Masphyc/WB /opt/JMAG/bin /opt/CSSCAN/bin)
    prompt  ws47{eb00d48}!%
    shell   /bin/csh
    status  0
    term    vt100
    user    eb00d48
    xinitpath       /usr/local/X11R6/bin
    ws47{eb00d48}2% 
path で始まる行は画面では3行に渡っています。 「ls」のようにコマンド名だけが入力されると、 その小カッコの中に書かれたディレクトリが次々とさがされ、 みつかった ls が実行されるのです。 ls は /usr/bin にありましたから、/usr/bin/ls が実行されます。

 ※ path に「.」を指定するのはやめたほうがいい。 特に「.」を先頭に指定するのは最悪だ。 たとえば、誰でも書き込めるディレクトリに ls という名前でよからぬことをするプログラムがしかけられていた場合、 そこで ls するとそいつを動かしてしまう! 同じ理由で、知らない人のディレクトリにある実行ファイルを実行するのも危険である。

 ※ コマンドがどこにあるかは whereis コマンドでさがせる。 「whereis ls」のように。

 ※ 環境変数の設定法などはまたあとで気がむいたら説明する。

finger, w, who

unix の finger コマンドを使うと、誰がその WS を使っているかわかります。

    ws47{eb00d48}1% finger
    Login       Name               TTY         Idle    When    Where
    ec00b99  ec00b99               console          Sat 14:59
    eb00d48  eb00d48               pts/0            Sat 15:28  science.s.kanazawa-u
    ws47{eb00d48}2%
Login はユーザ名。ログイン名ということもあります。 (ec00b99 は架空のユーザ名です。) Name は名前。上の例ではログイン名と同じですが、その点はすぐあとで説明します。 TTY はさしあたり気にしないこと。 ただし、console と書かれているユーザは WS の前に座っていることが多い、 ということは覚えておくと便利かもしれません。 Idle は、キー操作などをしないでほったらかしにしている場合にその時間がでます。 空白だったら1分未満(だったかな)。 When はログインした時刻です。 Where はどこからログインしたか。 science.s.kanazawa-u というのは私の研究室のマシン名です。

finger で表示される Name は、「passwd -r nisplus -g」で変えることができます。

    ws47{eb00d48}3% passwd -r nisplus -g
    Enter login(NIS+) password:
    Default values are printed inside of '[]'.
    To accept the default, type .
    To have a blank entry, type the word 'none'.
    
    Name [eb00d48]: TANAKA Misako
            NIS+ password information changed for eb00d48
    ws47{eb00d48}4% finger
    Login       Name               TTY         Idle    When    Where
    ec00b99  ec00b99               console          Sat 14:59
    eb00d48  TANAKA Misako         pts/0            Sat 15:28  science.s.kanazawa-u
    ws47{eb00d48}5%
2行目でパスワードの入力が求められています。 WS のパスワードを打ち込んで Enter です。 上の例では Name を TANAKA Misako(田中美佐子)としていますが、 これはあくまでサンプルです。自分の名前をいれてください。

登録した Name は出したメールに 「From: TANAKA Misako <eb00d48@mailedu2.ipc.kanazawa-u.ac.jp>」 のように載ります。

w も似た働きをしますが、何をしているかまでわかってしまいます。

    ws47{eb00d48}2% w
     午後 3時36分     稼働 28 日間, 22:04,  2 ユーザ,  平均負荷率: 0.00, 0.00, 0.02
    ユーザ   端末          開始時刻        待機   JCPU   PCPU  現プロセス名
    ec00b99  console      午後 2時59分       37      3      3  /usr/local/X11R6.3/li
    b/X11/fvwm2
    eb00d48  pts/0        午後 3時28分                         w
    ec00b99  pts/2        午後 3時00分       37                tcsh
    ws47{eb00d48}3%
当たり前のことですが、自分は w をしていると表示されています。

who というのもあります。

    ws47{eb00d48}3% who
    ec00b99    console      11月 14 14:59
    eb00d48    pts/0        11月 14 15:28   (science.s.kanazawa-u.ac.jp)
    ec00b99    pts/2        11月 14 15:00
    ws47{eb00d48}4%

man

「man コマンド名」でコマンドのマニュアルが見られます。 起動したあとの操作法は more と同じ。 man そのもののマニュアルは「man man」です。

シェルスクリプト

もっとも簡単に作れる実行ファイルは、 シェルスクリプト(shell script)と呼ばれるものでしょう。 「#!/bin/csh -f」のあとに、 順次実行させたいコマンドを一行ずつに並べたものを内容とするファイルを用意します。

    #!/bin/csh -f
    ls -la
    date
たとえばこのファイルの名前を「a」としましょう。 a のパーミッションを変え、自分に実行許可を与えます。 (755 にすればよいでしょう。) そうしておいて「./a」とすれば「ls -la」と「date」が続いて実行されます。 (date は現在の日時を表示するプログラムです。) タイピング練習の際の「~iwase/tx」も実はシェルスクリプトです。

前回説明したやり方でメールを送ることにしている場合、 メールの原稿を書くファイルの名前を決めておいて、 それを送信するシェルスクリプトを作るとメール送信が楽になるかもしれません。 興味のある人はやってみましょう。

Fortran コンパイラの使い方

ここで、「計算機基礎論1」に関連して、 Fortran コンパイラの起動法を説明しておきます。 私が説明できるのはコンパイラの起動法だけです。 Fortran 言語に関する質問はしないでください。

test.f のように .f で終わる名前をもつファイルに Fortran のプログラムを書いて「frt test.f」 とするとカレントディレクトリに a.out という名前の実行ファイルができるそうです。 test.f90 のように .f90 で終わっていると Fortran 90 で処理されます。 くわしいことは「man frt」でしらべてください。

標準入力と標準出力

コマンドの中には 「キーボードから受け取ったデータを処理し、結果を画面に書く」 というタイプのものがあります。 例えば sort はキーボードから受け取った行を辞書式順序に並べかえて画面に書きます。 ~iwase/rev はキーボードから受け取った各行の中の文字を逆順にして画面に書きます。

 ※ 「これでキーボードからの入力はおしまい」 というときは行頭で Ctrl+D を打ちます。

まずはこれらで少し“遊んで”みてください。

キーボード(から打ち込むデータ)を「標準入力(standard input)」、 画面(に書かれる結果)を「標準出力(standard output)」と呼びます。 sort は「標準入力を行単位で辞書式順序に並べかえて標準出力に送るプログラム」、 ~iwase/rev は「標準入力の各行を逆順にして標準出力に送るプログラム」、 ということになります。

リダイレクトとパイプ

標準入力や標準出力は、下のようにしてファイルに切り換えることができます。 それを 「リダイレクト(redirect)」とか 「リダイレクション(redirection)」と呼びます。 sort や ~iwase/rev でいろいろ試してみるとよいでしょう。

「prog < ifile」とすると、 単に「prog」として起動した後にファイル ifile の内容をキーボードから打ち込んだかのようにプログラム prog が動きます。 これを「入力リダイレクト」といいます。 前もってエディタを使ってデータを打ち込んでおけるので、 データ量の多いときなどに便利です。

 ※ ifile の内容が不適切だといつまでもコマンドが終了しない場合がある。 その場合は Ctrl+C を押して中止する。 sort や ~iwase/rev の場合はそのようなことは起こらないはず。

「prog > ofile」とすると、 プログラム prog の出力結果がファイル ofile の内容となります。 これを「出力リダイレクト」といいます。 出力結果をあとからエディタに読み込んでゆっくり調べたり、 編集して再利用できたりするので便利です。

メールの読み方のところで出てきた 「nkf -e mbox > mbox.euc」はその例です。 nkf -e はそのあとの引数で指定されたファイルの内容を日本語 EUC コードに変換して標準出力に送ります。 nkf についてはこの先にまとめてあります。

 ※ プログラムの中で何か質問してくるような場合、 そのメッセージまで ofile に行ってしまって画面には何も出力されない場合がある。

 ※ この「<」や「>」 は不等号ではなく方向を表わす矢印のようなものである。 「A < B」と「B > A」は意味が全く違うことにも注意。

 ※ すでに ofile があった場合は上書きされる。 すなわち、もしもこのコマンドの実行前に ofile が存在すれば、 その内容は永遠に失われる。

「prog >> ofile」とすると、 プログラム prog の出力結果はファイル ofile の末尾に追加されます。 ofile がなければ上の「>」の場合と全く同じです。 これも「出力リダイレクト」といいます。

「prog < ifile > ofile」や 「prog < ifile >> ofile」 は入力リダイレクトと出力リダイレクトの組合せです。 入力は ifile, 出力は ofile となります。

「prog1 | prog2」とすると、 prog1 の出力が prog2 の入力になります。 これを「パイプ(pipe)」といいます。

前にやった「ls -la | more」 やメールを送るときの「nkf -j test | Mail ""」はこの例です。 more が何をするプログラムかは、自分で考えてみてください。 nkf -j はそのあとの引数で指定されたファイルの内容を JIS 漢字コードに変換して標準出力に送ります。 nkf についてはこの先にまとめてあります。 Mail "" は標準入力の内容をメールにして発信します。

 ※ オプションなしの「ls」はやや特殊で、 「ls | more」とすると「自分の出力はパイプされているぞ!」 と知っていつもと違った表示のしかたをします。

nkf

nkf は漢字コード変換を行なうプログラムです。 ここでいう「漢字」とは全角文字のことだと思ってください。 「漢字コード」の代わりに「日本語コード」ということもあります。 「nkf -j」「nkf -s」「nkf -e」 はそれぞれそのあとの引数で指定されたファイルの内容を 「JIS 漢字」「シフト JIS」「日本語 EUC」に変換して標準出力に送ります。

実習用 WS が採用している漢字コードは日本語 EUC ですが、 メールは JIS 漢字で送るのが決まりです。 これで、メール送受信の際に nkf を使った理由がわかると思います。

諸君の実習用 ID の間では日本語 EUC のままでもメールが送れるかもしれませんが、 それはルール違反です。 相手によっては正しく読めなくて困る場合があります。

ここまでで、前回 「とにかくこうやればメールの送受信ができます」 と説明したやり方の各ステップが何をしていたかわかるはずです。 おさらいしてみてください。

mule についてもう少し

mule は、複数のファイルを複数のウィンドウで同時に編集できます。 mule ではファイル名をつけた文書以外も編集対象となるので、 編集中の文書を「バッファ(buffer)」と呼んでいます。 ファイルの編集をするときはファイルをバッファに読み込んで編集し最後にファイルに書き戻す。 ウィンドウにはどれかのバッファが表示される、という関係です。

次に、mule のコマンドのうち私がよく使うものをあげておきます。 emacs や mule のコマンドを説明するときの習慣に従って、 C-x で Ctrl+X を,M-x で Esc に続いて x を押すことを表わすことにします。 後者にはごくまれに M-X と M-x のような大文字小文字の区別がありますから注意してください。 また、SPC はスペースを表わします。

 ※ M-x という書き方は、 メタキーというキーがあるキーボードを想定しているかららしい。

 ※ 複数のキーからなるコマンドを中断するには C-g を用いる。

移動系 カーソルを移動 ←→↑↓キー
または C-b, C-f, C-p, C-n
(backward, forward, previous, next)
カーソルを行頭・行末へ移動 C-a, C-e
画面を大きく上下にスクロール C-v, M-v
ファイルの先頭・末尾へジャンプ M-<, M->
行番号を表示させる M-x what-line (←本当にこう打つ)
行番号を指定してジャンプ M-x goto-line (←本当にこう打つ)
挿入系 文字を挿入 その文字のキー
改行を挿入 Enter キー
コントロール文字を挿入 C-q に続いてその文字を入力
削除系 カーソル手前の一文字を削除 Delete キー
カーソルのあたっている一文字を削除 C-d
カーソルのある行を削除 C-a C-k C-k
カーソルから行末まで削除 C-k
行頭からカーソルまで削除 不明
行操作系 二つの行を連結 前の行の行末の改行を削除せよ
複写移動系
複写(copy) 複写したいブロックの始点で C-SPC,
終点で M-w, 複写先で C-y
移動(move) 移動したいブロックの始点で C-SPC,
終点で C-w, 移動先で C-y
検索置換系 文字列の検索(search) C-s(前方),C-r(後方)
文字列を置換(replace) M-%
ファイル・
バッファ・
ウィンドウ操作系
カーソル位置に他のファイルを挿入 C-x i
テキストの一部をファイルへ書き出す 不明
ファイルを新バッファに読み込む C-x C-f
バッファをファイルに書き込む C-x C-s
編集中のバッファ一覧を出す C-x C-b
バッファをなくす C-x k
ウィンドウ内で編集するバッファを変更C-x b
ウィンドウを二つに分割 C-x 2
ウィンドウを一つにする C-x 1
もう一つのウィンドウへカーソルを移動C-x o
アンドゥー系 操作の取り消し C-_(「_」は Shift を押しながら。
第三実習室からはなぜか使えない)
ヘルプ系 ヘルプ開始コマンド C-h
英文チュートリアル C-h t
日本語チュートリアル C-h T

 ※ 複写移動系は異なるバッファ間でも可能。

 ※ C-x b と C-x C-b を混同しないように。 前者では Ctrl を押しながら x を打ち、Ctrl を離してから b を打つ。 後者では Ctrl を押しながら x, b を順に打つ。

 ※ 上のコマンドのまとめかたは、emacs や mule の達人からはお叱りを受けるかもしれない。 emacs や mule の設計思想を理解しないまま、 自分のやりたい操作に沿ってまとめているからである。

メールの整理法

メールが増えてきたら、 全てを ~/mail/mbox に追加しつづけるのはうまくないかもしれません。 「相手別にファイルを分ける」 「日付でファイルを分ける」 などの方法を工夫してみてください。 また、JIS 漢字と日本語 EUC 両方でファイルを保存しておく必要もありません。

Mail についてもうほんの少し

unix のコマンドラインで「Mail」とするとメールボックスを見に行きます。 そこで前回は「s * mbox」とするように言いましたが、 代わりに「s 1 file1」とすれば 1 番のメールだけが file1 に移されます。 「s 2-4 file2」のようにすれば 2 番から 4 番が file2 に移されます。 (そういうことはあまりないでしょうが) 一画面に収まらないぐらい多くのメールがきていたら、 「z」でメール一覧の次のページが表示されます。 「z-」で前のページに戻ります。 こうやって、 来たメールはすべて自分のファイルに移してしまうほうがよいでしょう。 (そうでない読み方もありますが。) そして「q」で Mail を終了し、unix のコマンドラインにもどります。

grep

メールを収めたファイルが多くなってくると、 「あのメールはどのファイルにはいってたっけ」ということが起こります。 そんなときには grep が便利です。

「grep test *」とすると、カレントディレクトリのすべてのファイル (ただし「.」で始まる名前のものを除く)のなかから test という語句をさがし出します。 「grep test 9811*」だと 9811 で始まるファイル名のファイルだけからさがします。

実習参加者全員にメールを送るには

eb00d47 にメールを送ると、 この実習の参加者全員にメールが送られるようにしました。 そのしかけは ~eb00d47/.forward にあります。

メールにおける引用の慣習

相手からのメールを引用するときは、行頭に「>」をつける慣習です。たとえば

    私の傘、知らない?  あの青地に花柄の。なくしてしまって落ち込んでいます。
    もし見つけたら教えてね。
というメールに返事を書くとき、
    > 私の傘、知らない?  あの青地に花柄の。なくしてしまって落ち込んでいます。

    あ、それなら7講の傘立てで水曜に見たよ。
みたいな感じ。 「>」の次にスペースを置くか、 引用文と自分の文の間に空行を置くかどうかは好き好きみたいです。

課題その2

私 eb00d48 から「kadai (2)」というメールがきているはずです。 課題その2はそこに記してあります。


岩瀬順一 <iwase@math.s.kanazawa-u.ac.jp>