Title	第11章 csh入門
Date	2003年5月16日

+ 11.1 cshとは
  - シェル
  - (1)プロンプトを出力して,コマンドの入力を促す.
  - (2)キーボードからの入力(文字)を Enter(Return) が押されるまで蓄える.
  - (3)Enter が押されたら,蓄えておいた文字列を空白などで区切ってコマンドの名前と文字列と引数の文字列に分ける.
    - e.g.) 「ps u」としても「ps       u」としても同じ
  - (4)コマンドの名前から,その名前のプログラムを見つけ出す.
    - 詳細は 11.9 にて
  - (5)見つけたプログラムを起動し,引数の文字列を渡す.
  - (6)特に指定しなければ,シェルは起動したプログラムが終了するまで待つ.
  - コマンド名 or ファイル名の補完機能: Tabキー, C^d

+ 11.1.2 sh と csh
  - Cシェル: csh, tcsh
  - Bシェル: sh, bash

+ 11.1.4 cshの説明における「コマンド」という用語の使い方
  - 「ps コマンド」という場合
  - 「ps aux」をコマンドという場合
  - 「コマンドライン」という場合

+ 11.1.5 コマンドライン編集機能
  - C^a: 先頭に移動
  - C^e: 最後尾に移動
  - C^f: 右に一文字移動
  - C^b: 左に一文字移動
  - C^d: カーソルの位置にある文字を消去
  - C^h: カーソル位置の直前(左)にある文字を消去
  - C^k: カーソルの右側全てを消去(バッファにコピー)
  - C^y: バッファに保存されている内容をペースト(貼り付け)
  - C^l: 画面全体のクリア
  - C^p: 一つ前に入力したコマンドラインを表示
  - C^n: 一つ後ろのコマンドラインを表示

+ 11.2 I/O リダイレクションとパイプ
  - I/O とは
  - コマンドの実行結果を別のコマンドに処理させたい!
    - 現在実行中のプロセス数は?
    - リダイレクション)ps aux > result ; wc result
    - パイプ)ps aux | wc
  - 標準入力 stdin
  - 標準出力 stdout
  - 標準エラー出力 stderr

+ 11.2.1 リダイレクションとは
  - 標準出力をターミナルからファイルに変更
    e.g.) ps aux > result
  - 標準入力をターミナルからファイルに変更
    e.g.) cat < result

+ 11.2.3 パイプ
  - コマンドの実行結果を標準出力から標準入力に変更
    e.g.) ps aux | wc
    「ps aux」による出力を「wc」への入力に変更

+ 11.2.5 I/O リダイレクションとパイプの詳細
  - 「$command > file」
  - 「$command >> file」
  - 「$command >& file」
  - 「( $command > file1 ) >& file2」
  - 「$command1 | $command2」
  - 「$command1 |& $command2」

+ 演習
  - 「ps aux」で全プロセスを出力し,root が実行しているプロセス数を数えよ.リダイレクションを使用する方法と,パイプを使用する方法二通りを考えよ.
  - ヒント1:ps aux による出力結果には,root 以外のユーザによるプロセスも含まれている.この中から root の記載されている行のみを探し出し,その行数を数えると「rootが実行しているプロセス数」となる.
  - ヒント2:次の3行が「test.txt」というファイルに書かれているとする.
	abc
	1 2 3
	abc 1 2 3
  - このファイルから「abc」という文字列が含まれている行は「grep abc test.txt」として抜き出すことが出来る.
  - ヒント3:ファイル内の行数を数えるには「wc -l test.txt」とする.

+ 11.3 変数
  - 変数
  - 変数名
  - 変数の値
  - 変数の値を参照
  - 変数に値を代入

- 11.3.2 シェル変数
  - set
  - set test=123
  - echo $test
  - unset test

- 11.3.3 環境変数
  - setenv
  - setenv test 123
  - echo $test
  - unsetenv test

+ 11.3.4 シェル変数と環境変数の違い
  - シェル変数はシェル毎に異なるが,環境変数は引き継がれる.
  - シェル変数では変数の値にリストが許される: echo $path[1]

+ 11.4 メタキャラクタとエスケープ
  - cshが解釈する文字=cshのメタキャラクタ: >
  - メタキャラクタの機能をオフにする=エスケープ: \, '', ""

+ 11.5 ファイル名置換
  - main.c と subroutine.c という二つのファイルで動くプログラムを簡単にコンパイルするには?
  - * と ?
  - [str]

+ 11.5.4 ファイル名補完
  - 補完できる部分を補完: Esc, Tab
  - 補完候補を表示: C^d

+ 11.6 実行制御
  - フォアグラウンドジョブ
  - バックグラウンドジョブ: コマンド実行時に,コマンドライン最後尾に「&」を付ける
  - 順次実行: $command1 ; $command2 ; $command3
  - コマンド1が正常終了ならコマンド2を実行: $command1 && $command2
  - コマンド1が異常終了ならコマンド2を実行: $command1 || $command2

+ 11.7 ヒストリ機能
  - history
  - C^p, C^n もしくはカーソルキーの上下
  - !

+ 11.8 エイリアス機能
  - コマンドに別名を付ける: alias $name $command-line
  - エイリアス設定の表示: alias
  - エイリアスの削除: unalias $name
  - シェルスクリプトではできないエイリアスの応用
    - why?) シェルスクリプトでは,新しいシェルを起動してスクリプトを実行する.そのスクリプト内で変更されたシェル変数は,新しいシェルのものであり,元のシェル変数はそのまま保たれているため.

+ 11.9 コマンドサーチパス
  - (1)コマンドが「/」を含めば,パス名を指定したものとして,そのプログラムを実行.
 - (2)コマンドが組み込みコマンド(cdなど)なら,その組み込みコマンドを実行.
  - (3)シェル変数 path を使って,実行可能なファイルがそのパスで指定されたディレクトリ内にあるかを順に探し,最初に見つけたものを実行.
  - (4)以上で実行できなければ,コマンドが見つからないという表示「Command not found」を表示.
  - which ls
  - echo $path

+ 11.10 ディレクトリスタック
  - pushed /etc
  - pushed
  - poped

+ 11.11 資源の制限
  - limit
  - limit $resource $value
  - unlimit $resource

+ シェルスクリプト例
  - menu
  - mkhtml

+ 演習
  - menu に「自分のプロセスを表示するメニュー」と「指定したプロセスIDのプロセスを殺すメニュー」を追加せよ.
  - ヒント1: 「自分のプロセスを表示する」コマンドは ps
  - ヒント2: 「プロセスを殺す」コマンドは kill
  - ヒント3: ターミナルからの入力を変数に代入するのは「set PROCESSID=$<」とする.