UNIXメモ

このメモは、Red Hat系のLinuxディストリビューションをインストールして適当に使った経緯の中で作成されている。したがって、不正確であったり、陳腐であったり、他のUNIX系システムやLinuxディストリビューションでは通用しない情報も多いと思われる。コマンドの用法や用例は主に使うもののみを掲載している。なお、この文書の閲覧、複製、改編、転載に関して一切の条件を設けない。

このメモは、端末入力シェルユーザアカウントシステム情報テキスト処理ファイル操作プロセス管理デバイス管理アーカイブネットワーク環境設定シェルスクリプトX Window System正規表現ViエディタEmacsエディタC言語プログラミングCVSApacheディレクトリ階層私的環境設定その他のTIPSの項に分かれている。


端末入力

UNIXの利用は通常、端末(tty: teletype、terminal)にキー入力をすることでなされる。キーボードに打ち込んだ入力は端末を介して他のプロセスに送られ、さらにエコーバックによって画面に文字が表示される。シェル(コマンドラインインタープリタ)に送られた文字列は、Enter(改行)キーの入力を受けてコマンドとして解釈され、その処理が実行される。改行のような制御文字は Control キーを押しながら通常のキーを押すことで入力できる。以下のキーバインドはその一例であるが、stty コマンドで割り当てを変更することもできる。

Ctl-m改行。コマンドの入力完了。Enterキーも同じ
Ctl-iタブ。タブストップ(通常8文字ごと)まで進む。Tab キーも同じ
Ctl-gベル。警告音を鳴らす
Ctl-deof。入力完了の文字を入力。Delete キーも同じ
Ctl-cintr。実行中のプロセスに割り込み、即座に終了。Break キーも同じ
Ctl-\quit。プロセスを中止させ、core ファイルを生成
Ctl-zsusp。プロセスを一時停止
Ctl-sstop。端末の出力を一時停止
Ctl-qstart。停止した端末出力を再開
Ctl-herase。直前の文字を削除。BackSpaceキーも同じ
Ctl-wwerase。直前の単語を削除
Ctl-ukill。行を削除
Ctl-vlnext。次の入力文字を制御文字として解釈しない

端末を通過した入力は、端末と連結しているシェル等のプロセスに渡される。bash の場合、そこで以下の制御文字を解釈する。また、タブの入力はコマンドのコンプリション(補間入力)として解釈される。

Ctl-fカーソルを次の文字に移動。方法キーの右も同じ
Ctl-bカーソルを前の文字に移動。方向キーの左も同じ
Ctl-n直前のコマンドを表示。方向キーの上も同じ
Ctl-f直後のコマンドを表示。方向キーの下も同じ
Ctl-aカーソルをコマンドラインの先頭に移動
Ctl-eカーソルをコマンドラインの末尾に移動
Ctl-kカーソル位置以降の文字を削除
Ctl-uカーソル位置より前の文字を削除
Ctl-rヒストリの逆方向インクリメンタルサーチ
Ctl-l画面全体を消去

シェル

端末にプロンプトが表示されている状態で、そこにコマンド名を入力すると、シェルがそのコマンドを実行してくれる。コマンド名の後にスペースで区切った文字列を置くと、それが引数としてコマンドに渡される。コマンドによって異なるが、引数には操作対象のファイル名や挙動を指定するオプションが用いられる。なお、ログイン直後に起動されるシェルをログインシェルという。

UNIXのファイルシステムでは、全てのファイルはルートディレクトリを起点とする経路(絶対パス)によって指定される。ただし、現在作業中のディレクトリ(カレントディレクトリ)からの経路(相対パス)によってファイルを指定することもできる。パターンにパスが一致する全てのファイルをコマンドの引数として渡したい時は、シェルに文字列展開させて指定するワイルドカード機能を用いる。シェルは他にもメタキャラ(特殊文字)を用いて利用する制御機能を幾つか持っている。以下は bash のメタキャラの例である。

/ ルートディレクトリ。ディレクトリ名の区切りとしても使う
~user 指定したユーザのホームディレクトリ。~ だけだと自分のホームを表す
. そのディレクトリ自体
.. そのディレクトリの親ディレクトリ
スペース コマンド名やコマンド行引数を区切る
* 0文字以上の任意の文字列(ファイル名の先頭の . は除く)
? 任意の1文字(ファイル名の先頭の . は除く)
[letters] [ ] の中で指定するいずれか1文字。a-z のように範囲で指定してもよい
{letters} { } の中で指定する文字列
$name 指定した変数やパラメータの値に置き換える
\ \* のように使って、直後の特殊文字の機能を打ち消す。改行によるコマンド実行も抑制する
'string' '' で挟んだ全ての特殊文字の機能を打ち消す
"string" "" で挟んだ $ と ` と \ 以外の特殊文字の機能を打ち消す
`command` `` で挟んだコマンドの標準出力に置き換える
# 行末までの文字列をコメントとして無視する

標準入力はキーボードからの入力をプログラムに送るためのものであり、標準出力と標準エラー出力はプログラムからの出力をディスプレイに送るためのものである。それらを指定したファイルへ入出力に切り替えるのがI/Oリダイレクション機能である。パイプはプログラムの標準出力を別のプログラムの標準入力につなげて連携させる機能である。端末入出力を明示的に標準入力に指定する場合は /dev/tty をリダイレクションし、出力を捨てたい場合は /dev/null にリダイレクションするとよい。/dev/null を入力にリダイレクションすると空のファイルを指定したようになり(いきなりEOFを返す)、/dev/zero を入力にリダイレクションすると nil 文字を連続して読み込む。

command < file 標準入力をそのファイルに切り替える
command > file 標準出力をそのファイルに切り替える。既にそのファイルがある場合は書き換える
command >> file 標準出力をそのファイルに切り替える。既にそのファイルがある場合は、末尾に追加
command >& file 標準出力と標準エラー出力を一括してそのファイルに切り替える
command 1>&2 コマンドの標準出力を標準エラー出力に切り替える
command1 | command1 command1 の標準出力を command2 の標準入力として両者を同期させて実行する

bash では、以下の構文を使うと、複数のコマンドを連携させて実行することができる。| ; & && || で組み合わせたコマンド群をコマンドリストと言い、それを { } で括ったものをコマンドグループと言う。なお、{ } の内の末尾は ; か改行でなければならない。

command ; command コマンドラインを二つに区切って、両者を順番に実行する。改行は ; と同じ意味を持つ
command & コマンドをバックグラウンドで実行し、終了をまたずに制御を次に移す
command1 && command2 command1 が成功したら command2 を実行し、失敗したらそこで終る
command1 || command2 command1 が失敗したら command2 を実行し、成功したらそこで終る
{ list } { sleep 3 ; echo hello ; } & のように、複数のコマンドをリストにしてそのシェルが実行
( list ) ( sleep 3 ; echo hello ) & のように、複数のコマンドをリストにしてサブシェルで実行

ユーザアカウント

システムを利用する上で、ユーザを作成および削除したり、シェルを起動および終了させる、以下のコマンドを習得する必要がある。

exit [number]
シェルを終了させる。ログインシェルを終了させるとログアウトする(csh系では logout を使う)。number は実行環境に渡す戻り値を指定。
su [-] [user [args ...] ]
別のユーザに変更してシェルを起動する。user を省くと、root に変更。- をつけると、新たにユーザ設定を読み直す。args を指定した場合、それらはシェルに引数として渡される。
useradd [-dMgGsu] user
新規ユーザおよび関連するファイルを作る。その後、passwd コマンドによるパスワードの設定が必要である。ホームディレクトリの内容は /etc/skel からコピーされる。
-d directory : ホームディレクトリを指定
-M : ホームディレクトリを作らないことを指示
-g group : 初期グループを指定
-G groups : 他に所属するグループをカンマで区切りで列挙して指定
-s shell : ログインシェルを指定
-u uid : ユーザIDを指定
userdel [-r] user
ユーザおよび関連するエントリを削除する。
-r : ホームディレクトリも削除
passwd [-d] [user]
ユーザのログイン時のパスワードを設定する。user を省くと自分のパスワードを設定する。パスワードは /etc/passwd か /etc/shadow に記述される。
-d : ユーザのパスワードを無効化する
chsh
ログインシェルを変更する。このコマンドがない場合は、passwd -e で同様の操作ができるかもしれない。
groupadd [-g] group
新規グループを作成する。
-g gid : グループIDを指定
groupdel
グループおよび関連するエントリを削除する。
bash [file]
bash を起動させる。file を指定した時はそのシェルスクリプトを実行し、そうでない時は標準入力を読み込む対話モードになる。なお、bash はLinuxの標準シェルであるが、その他に sh(他の多くのUNIXの標準シェルで、Linuxでは実体は bash)、ksh(sh を拡張してジョブ制御等の機能をつけたシェル)、csh(C言語に似た文法のシェル)、tcsh(csh を拡張して補完入力等の機能をつけたシェル)、zsh(shとcshの両方の機能を持つシェル)、ash(Linux上で標準の sh との互換性を試すためのシェル)等がある。
-norc : 初期設定ファイル .bashrc を読み込まない
-rcfile file : .bashrc の代わりに指定したファイルを読み込む
-c command : 指定したコマンドラインを実行して終了する

システム情報

システムの状況を確認したり設定するには、以下のコマンドを用いる。

whoami
自分のユーザ名を出力する。
tty
標準入力に接続されている端末のファイル名を出力する。
id [-un] [user]
指定したユーザの名前、ID、グループ名、グループIDを出力する。user を省くと自分を指定する。
-un : ユーザ名のみを表示。環境変数 USER の出典となる
date [format]
現在の日時を出力する。スーパーユーザの場合は、format を指定するとシステムの現在時刻を設定できる。例えば、date 0913082594 とすると、1994年9月13日8時25分に設定される。
cal [month] [year]
カレンダーを出力する。monthyear を省略すると、今月のカレンダーを表示する。
uname [-a]
システムの情報(OSの名前)を出力する。
-a : バージョンや作成日などの情報も出力
pwd
カレントディレクトリの絶対パスを出力する。
ls [-alFdR] [file]
ディレクトリ内のファイル一覧を出力する。ファイル自身を指定してもよい。file を省略すると、カレントディレクトリの内容を表示する。
-a : 隠しファイル( . で始まる名前のファイル)も出力
-l : パーミッション、リンク数、オーナー、グループ、サイズ、作成日時の情報も出力
-i : inode番号も表示する
-s : ブロックサイズも表示する
-d : 指定したディレクトリ自身(中身ではなく)の情報を出力
-R : サブディレクトリの中身も再帰的に参照する
-F : ファイル名の末尾に / などの文字を付けてファイルの種類を示唆
--color=tty : カラー表示でファイルの種類を示唆
stat [file ...]
ファイルのファイルシステム上の情報を出力する。
file file ...
ファイルのデータフォーマットを判定して出力する。
history [number]
実行したコマンドの履歴を表示する。number は表示数を指定する。なお、プロンプトで !str とすると、履歴の中で str で始まる最近のコマンドを実行することもできる。!! とすれば、直前のコマンドを実行する。
echo [string ...]
引数の文字列をそのままエコーバックする。string を省略すると、標準入力を出力する。
-n : 出力の最後に改行を付加しない
-e : C言語風のバックスラッシュエスケープを解釈
printf format ...
C言語の printf 関数の様なフォーマット変換と出力を行う。
who
システムにログインしている全ユーザの名前や使用端末、ログイン時間などを出力する。
w [user ...]
who の情報に加えて、現行プロセスや待機時間なども出力する。システムの情報も出力する。user をつけると、そのユーザの情報のみ出力する。
finger [user ...]
who の情報に加えて、ログインシェルやホームなども出力する。user を省略すると、ログインしている全員の情報を出力する。chfn を使って表示される内容を変更することができることもある。
which command ...
コマンドのフルパスを出力する。ただし cd や export 等のシェル組み込みコマンドは感知しない。
whereis name ...
コマンドとソースとマニュアルの場所を名前で検索する。
locate name ...
データベースを使って name ファイル名に含むファイルの場所を検索する。
-i : 検索時に大文字と小文字を区別しない
-u : データベースを更新。updatedb という別コマンドになっている場合もある
-e "directories": データベースを更新時に、カンマ区切りで並べたディレクトリ以下は探索しない
-f "filesystems": データベースを更新時に、カンマ区切りで並べたファイルシステムは探索しない
find [directory] [options] [expr] [action]
ファイルの場所を検索する。dir は検索開始ディレクトリで、省略するとカレントディレクトリになる。expr は、それが真となるファイルを処理対象にすることになる判別式であり、以下のものがある。判別式は -and および -or で区切って論理結合でき、また -not で真偽を反転させることができる。判別式を -or で結合する際は、優先順位を上げるために判別式全体を ( ) で括る必要がある。引数の数字は直前に - を付けるとその数値未満の集合を表し、+ を付けるとその数値を越える集合を表す。
-name name : ファイル名が指定した文字列と一致するなら真
-iname name : 大文字と小文字を区別しない以外は -name と同じ
-regex name : ファイル名が正規表現に合致するなら真
-iregex name : 大文字と小文字を区別しない以外は -iregex と同じ
-mmin num : 最終更新時刻が現在時刻から指定した時間(分単位)なら真
-mtime num : 最終更新時刻が現在時刻から指定した時間(日単位)なら真
-type f : 通常のファイルなら真
-type d : ディレクトリなら真
判別式が真の際の処理は action で定義されるが、省略された場合は -print が指定されたとみなす。
-print : ファイル名を各行に表示
-printf format : 書式指定にしたがって出力。変換指定は %p(ファイル名)、%f(親ディレクトリ部分を除いたファイル名)、%s (ファイルサイズ)、%u(ユーザ名)など
-exec command : 検索されたファイル名に対してコマンドを適応する。'{}' 引数は対象ファイル名に置換され、コマンドの最後には ';' を置く必要がある。例えば、HTMLファイルから apple という語を全文検索したい場合は、find -name '*.html' -exec grep -l apple '{}' ';' とする
オプションには以下のものがある。
-follow : シンボリックリンクも追跡
-maxdepth level : サブディレクトリを探索する最大階層を指定
-noleaf : UNIX以外のファイルシステムを探索する際に、UNIX用の最適化を抑制
-xdev : 他のファイルシステムは探索しない
df
ファイルシステムのディスク使用状況を出力する。
-T : ファイルタイプも表示
-a : /proc などの特殊なファイルシステムも表示
du [directory ...]
ディレクトリ以下の全てのファイルとディスク占有量を出力する。directory を省略するとカレントディレクトリを指定する。
-h : 単位を適切に選んで表示
-k : キロバイト表示
-m : メガバイト表示
vmstat [delay]
プロセス・メモリ・ページング・ブロック IO・トラップ・CPU 稼働状況などの情報を表示する。delay は秒単位で更新時間を指定し、省略すると、一回だけ表示して終了する。
free
メモリの使用状況を出力する。なお、swapon -s とすると、スワップの利用状況がわかる。
top
システムリソースの使用状況がリアルタイムで表示される。
time command
コマンドを実行し、それにかかった実時間、ユーザ時間(プログラム内部で使った時間)、システム時間(システムコールで使った時間)を測定して出力する。
last [user ...]
全ユーザのログイン履歴を出力する。user をつけるとそのユーザの情報のみ出力する。
clear
端末の画面を刷新する。
dmesg
カーネルのログを出力する。
man [-kat] [section] [name]
マニュアルをページャで表示する。通常、name はコマンド名や関数名を指定する。section は以下の章を指定するが、省略した場合は最も若い章を選択する。name に intro を指定すると各章の概要がわかる。オンラインマニュアルを通常のテキストとして取り出したい場合は、man command | col -b -x とするとよい。なお、シェル組み込みコマンドについては help command で簡単な説明が見られる。 オプションには以下のものがある。
-k keyword : キーワードを含むマニュアルを検索。同機能のコマンドに apropos がある
-a : 該当する全てのページを表示
-t : マニュアルをPostScript形式で出力する
info [topic]
特定のトピックの情報ページをEmacs上で閲覧する。topic はトピックを指定するが、省略した場合はトピックの一覧をスタートページにする。トピックの情報はツリー構造で管理され、子ノードへのリンクがある場合は、そのアンカにカーソルを合わせてでReturnキーを押すとそこに移動できる。前のノードに移動する場合は p を押し、次のノードに移動する場合は n を押す。親ノードに移動する場合は u を押す。

テキスト処理

テキストの処理を行うには、以下のコマンドを用いる。

cat [-nb] [file ...]
テキストファイルの中身を一度に出力する。file を省略すると、標準入力を出力する。
-n : 行番号も表示する
-b : 空白行を除いて、行番号を表示する
-v : タブと改行以外の制御文字を可視化させる。
-t : タブと改行を含む制御文字を可視化させる。
head [-n] [file ...]
テキストファイルの冒頭を表示する。デフォルトは10行。
-n number : 表示する行数を指定
tail [-n] [file ...]
テキストファイルの末尾を表示する。デフォルトは10行。
-n number : 表示する行数を指定
-f : ファイルの末尾を読み込んでも終了せず、増分を出力し続ける
grep [-inlcv] [-number] pattern [file ...]
テキストファイルから、pattern で指定した文字列を含む行を抜き出して出力する。file を省略すると、標準入力を用いる。pattern は正規表現を用いるが、シェルにとっての特殊文字を含む場合は "I am" のように二重引用符で括るのは言うまでもない。正規表現を強化した egrep、正規表現が使えないが高速な fgrep もある。
-i : 大文字と小文字を区別しない
-n : 行番号も出力
-l : 該当したファイル名を出力
-c : 該当した行数を出力
-v : 該当行以外の行を出力
-q : 出力を抑制する
-number : 該当行の前後の行も指定行数だけ出力
tr [-d] set1 [set2]
標準入力を読み込み、文字列 set1 に含まれる文字を文字列 set2 の対応する文字に置き換えて出力する。set1set2 にはC言語風のエスケープ文字を用いることができ、例えば改行をタブに置き換える場合は tr '\n' '\t' とする。
-d : 置き換えでなく、削除を行う
-s : 置き換えでなく、連続する文字を1文字に圧縮する
col [-bx]
標準入力を読み込み、逆改行や半改行等の、通常の端末で表現できない制御文字を削除した結果を出力する。またできるだけスペースを同じ桁数に相当するタブ文字に置き換える。
-b : バックスペースも削除
-x : スペースをタブに置き換えない
sed [-efn] 'command' [file ...]
ファイルから読み込んだテキストを処理して出力する。file を指定しなかった場合は標準入力を読み込む。'command' は実行される処理を記述し、 'address function' という形をとる。address は処理の対象となる行を指定するもので、// で挟んだ正規表現を用いるか、数字で行番号を指定する。複数行を指定するときは , で区切り、あるいは省略すれば全ての行を指定する。function には p(行出力)、d(行削除)、s(文字列置換)、y(文字置換)、q(終了)等があるが、それぞれで形式は異なる。例えば以下のような使い方をする。
sed -n '10,15 p' : 1行目から5行目を出力
sed '1 d' : 1行目を削除
sed '/^apple/ d' : apple で始まる行を削除
sed 's/apple/orange/g' : apple を orange に置換。apple の部分は正規表現である
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' : 大文字を小文字に置換
sed '20 q' : 20行目までを出力
オプションには以下のものがある。
-e 'command' : 通常、複数の -e オプションを使って、複数のコマンドを実行
-f file : ファイルからコマンドを読み込む
-n : 明示的な出力処理以外の出力を抑制
ed [-s] file
ファイルから読み込んだテキストを処理する。sed のようなコマンドを標準入力から読み込む。各コマンドは改行で終る必要がある。処理結果は w コマンドによって元のファイルに保存する。例えば fruit というファイルから apple で始まる行を削除するには、printf '/^apple/ d\nw\n' | ed fruit とすればよい。
-s : 処理結果の診断メッセージを抑制
awk 'command' [file ...]
ファイルから読み込んだテキストを処理して出力する。file を指定しなかった場合は標準入力を読み込む。'commnad' は 'pattern {action}' という形をとる。pattern に合致した行に対して action を実行する。各行は空白文字を区切り文字としてフィールドに分けられ、pattern および action において、第1フィールドは $1、第2フィールドは $2 といった具合に参照することができる。行全体は $0 である。フィールド数を表す NF や、行番号を表す NR もある。pattern には、// で挟んだ正規表現を用いるか、数字で行番号を指定するか(複数行を指定するときは , で区切る)、$1 < 3 等の条件文を用いる(複数の条件を指定する時は && や || で結合する)ことができる。pattern を省略すれば全ての行と合致する。ファイルの先頭および末尾に合致する BEGIN と END もある。action には、改行または ; で区切った命令文を置く。出力を行う print 文や、C言語の演算子と式文が使える。変数は宣言なしで使える。printf も使える。例えば、以下のような使い方をする。
awk '$1 >= 50 { print $4 }' : フィールド1が 50 以上の行のフィールド4を各行に出力
awk 'BEGIN { n = 0; sum = 0 } { n++; sum += $1 } END { print sum / n }' : フィールド1の平均を出力
オプションには以下のものがある。
-f file : ファイルからコマンドを読み込む
-Ffs : 区切り文字を fs にする
perl [-e] [file]
C言語のようなスクリプト言語を実行する。file を省略すると、標準入力を読み込む。sed のコマンドをPerl言語に変換する s2p や awk のコマンドをPerl言語に a2p もある。
-e command : 指定したコマンドを実行
sort [-rfbnc] [+number] [file ...]
テキストファイルの各行をアルファベット順で並び変えて出力する。file を省略すると標準入力を読み込む。例えば、ls -l | sort -n +4 とすると、ファイルリストが容量順にソートして表示される。
-r : 逆順にする
-f : 小文字と大文字を区別しない
-b : 行頭の空白を比較対象にしない
-n : 先頭の文字列を数値文字列とみなして比較
-c : ソートされているかのチェックのみ行う
+number : 各行において、number 個分の空白部がくるまでの文字列をソート対象としない
uniq [-c] [file]
読み込んだテキストの連続する全く同じ行を一つに省略して出力する。file を省略すると標準入力を読み込む。主に sort の出力に対して用いる。
-c : 重複した行数を行頭に出力する。
more [file]
テキストファイルの中身を表示するページャ。file を省略すると標準入力を読み込む。Enterで一行、Spaceで一画面分下にスクロールする。方向キーの下も使える。/ で前方検索ができる。
less [-S] [file]
テキストファイルの中身を表示するページャ。more の機能に加えて、端末依存の効果や操作が可能。gz形式で圧縮されたテキストも閲覧できる。EmacsやViの操作で移動や検索が可能。v を押すとエディタが起動する。
-S : 長い行を右端で折り返さない
-N : 画面左端に行番号を表示
-i : 検索時に大文字と小文字を区別しない
-f : バイナリファイルを開こうとした時の警告を抑止
lv [-IO] [file]
多言語対応のページャ兼フィルタ。通常は less のようなページャだが、端末以外を標準出力にするとフィルタになる。オプションで指定するコードには、j(ISO-2022-JP)、ej(EUC-JP)、s(Shift_JIS)、u7(UTF-7)、u8(UTF-8)などがある。grep の多言語対応である lgrep もある。
-Icode : 入力の文字コードを指定
-Ocode : 入力の文字コードを指定
pr [file ...]
テキストファイルをヘッダ付きのページレイアウトに整形して出力する。file を省略すると標準入力を読み込む。
-numbernumber 段組に整形
diff [-r] fromfile tofile
2つのテキストファイルやディレクトリの中身を比較し、差分を出力する。fromfiletofile にディレクトリを指定した場合、各々の中にある同名のファイルを比較する。なお、パッチを作成する際はcontext形式がよいとされる。
-i : 大文字と小文字を区別しない
-r : ディレクトリの中身も再帰的に探索して比較
-c : 出力にcontext形式を用いる
-u : 出力にunified形式を用いる
-f : 出力にed形式を用いる
-y : 出力にside-by-side形式を用いる
cmp file1 file2
2つのテキストファイルやディレクトリの中身を比較する。差分は出力しないが、バイナリにも使える。
patch
diff による差分情報を使って、ソースファイルにパッチを当てる。通常は対象ファイルと同じディレクトリにて、patch < patchfile とすればよい。差分の形式にはnormalとcontextとunifiedが使える。
paste file1 file2
file1 の各行末に file2 の対応する行をタブ区切りでつなげて出力する。
-d character : 区切り文字を指定
cut [-bfds] [file]
テキストの各行をから文節を抜き出す。文節指定は b か f のオプションで指定する。file を省略すると標準入力から読み込む。
-b number : バイトの行頭から数えた指定番地を抜き出す
-f number : タブで区切ったフィールドの行頭から数えた指定番地を抜き出す
-d charcter : フィールド区切りの区切り文字を変更
-s : フィールド区切りの区切り文字を含まない行を表示しない
wc [-l] [file ...]
テキストファイルの英単語を数える。行数、単語数、バイト数、ファイル名の順で出力する。file を省略すると標準入力をカウントする。
-l : 行数のみを出力
fold [-ws] [file ...]
行を指定文字数で折りたたむ。日本語には対応していない。
-w number : 文字数を指定。デフォルトは80文字
-s : 単語の境界で折り返す
ispell file ...
スペルチェックする。ストリーム指向の spell もある。
groff [-mpackage] [-Tdevice] [file]
troff形式のファイルをデバイス用に整形して出力する。file を省略すると標準入力を読み込む。package は対象ファイルが使用しているマクロパッケージを指定する。パッケージは /usr/share/groff/tmac/ にある。オンラインマニュアル用のパッケージは andoc である。device は表示用デバイスを指定し、以下のものがある。デフォルトはPostScript形式である。
ps : PostScript形式
dvi : TeXのdvi形式
ascii : 端末表示用のタイプライタ形式。
nippon : 端末表示用のタイプライタ形式(日本語対応)。
html : HTML形式
nkf [-jse] [file]
ファイルの文字コードを変換して出力する。file を省略した場合は標準入力を変換する。
-j : 7bitJIS に変換
-s : Shift-JIS に変換
-e : EUC に変換
-Ltype : 改行コードを変換。type には u(LF)、w(CR+LF)、m(LF)のどれかを指定
od [-t format ...] [file ...]
テキストファイルの各バイトの状態を数字にして出力する。file を省略した場合は標準入力を読み込む。formatには以下のような指定を複数併用できる。どれも指定しなかった場合は2バイトずつを各6桁の8進数で出力する。より便利な hexdump コマンドもある。
a : 1バイトずつ文字の名前で出力。印字不可コードは名前を用いる
c : 1バイトずつ文字の名前で出力。印字不可コードは \ でエスケープ
o1 : 1バイトずつ8進数で出力
d1 : 1バイトずつ10進数で出力
x1 : 1バイトずつ16進数で出力
x2 : 2バイトずつ16進数で出力
strings [file ...]
バイナリからテキストを取り出す。file を省略した場合は標準入力を読み込む。
tee [file ...]
標準入力をファイルと標準出力の両方に出力する。
yes [string ...]
指定した文字列と改行を標準入力に出力し続ける。string を省略した場合は y を出力する。
seq [-f] [ first [ increment ] ] last
数字を順番に出力する。first は最初の値でデフォルトは 1 、increment は各回で増やす値でデフォルトは 1 、last は最後の値を指定する。
-f format : printf の様なフォーマット指定を行う。ただし %d の代わりに %g を使う
bc
標準入力から数式を読み込んで、演算結果を出力する。C言語に似た構文を用い、変数や括弧も使える。
xargs [command]
標準入力の各単語を command の引数として、それを実行する。command が省略された場合は echo を用いる。
script [file]
シェル等のプログラムから端末への出力を、指定したファイルにも記録する。記録を終えるにはそのプログラムを終了させればよいので、シェルなら exit する。file を省略した場合は typescript というファイルに記録される。

ファイル操作

ファイルやディレクトリの操作を行うには、以下のコマンドを用いる。

cd [diractory]
カレントディレクトリを移動する。directory を省略すると、自分のホームディレクトリに移動する。
rm [-ifr] file ...
ファイルを削除する。
-i : 確認しながら削除
-f : 強制削除
-r : ディレクトリを中身ごと削除
cp [-iRpad] source ... dest
ファイルをコピーする。source はコピー元、dest は作成するコピーのパスを指定する。コピー先がディレクトリ名の場合は、そのディレクトリの中に同名のファイルを作成する。3つ以上の引数を与えた場合、最後の引数をコピー先ディレクトリにして、その中にそれ以外の引数のファイルをコピーする。
-i : コピー先に同名のファイルがある場合に確認する
-R : ディレクトリは中身ごとコピーし、シンボリックリンクはシンボリックリンクのままコピーする
-p : 所有者やパーミッション情報を元のファイルと同じにする
-a : ファイルシステムの構造を保ったままでディレクトリをコピーする
-d : シンボリックリンクのリンク先を追跡しない
mv [-r] source ... dest
ファイルを移動。source は移動元、dest は移動先のパスを指定。移動先がディレクトリ名の場合は、そのディレクトリの中に移動する。引数が3つ以上の場合は、cp と同じ規則で移動を行う。
-i : 移動先に同名のファイルがある場合に確認する
-r : ディレクトリを中身ごと移動する
rename from to file ...
file で指定したファイルを対象とし、ファイル名の from に一致する部分を to に置き換える。
touch file ...
空のファイルを作成する。既存のファイルを指定すると、最終更新時刻を更新する。
mkdir [-p] directory ...
空のディレクトリを作成する。
-p : 親ディレクトリが存在しない場合に、それも作成する
rmdir directory ...
空のディレクトリを削除する。
mkfifo fifo ...
FIFO(名前付きパイプ)を作成する。
ln [-s] source [link]
ファイルのリンク(ファイル名)を追加作成。source はリンク先、link は作成するリンクのパスを指定。link を省略すると、カレントディレクトリに source と同名のリンクを作る。リンク(ハードリンク)はファイルのinodeを参照するものであり、ディレクトリに対して追加作成することはできないし、別のファイルシステムを参照することはできない。シンボリックリンクは、ファイル名を参照する仕組みであり、リンク先の制限は無い。
-s : シンボリックリンクを作成
chmod [-R] mode file ...
ファイルやディレクトリのパーミッションを変更する。mode は 644 のように、自分、グループ、その他の順で対応する各桁に対して、実行(1)、書き込み(2)、読み出し(4)の和の数字を用いて設定する。通常、普通のファイルは 644、ディレクトリと実行可能ファイルは 755 にすればよい。さらに、メモリ常駐の sticky(1)、プロセスの uid をファイル所有者と同じにする set-uid(2)、プロセスの同じく gid を同じにする set-gid(4)の和を前に付けて、それらの指定することもできる。
-R : サブディレクトリの内容も再帰的に変更
chown [-R] user file ...
ファイルやディレクトリの所有者を変更する。chown taro:member のように、所有者とグループを同時に設定することもできる。
-R : サブディレクトリの内容も再帰的に変更
chgrp [-R] group file ...
ファイルやディレクトリのグループを変更。
-R : サブディレクトリの内容も再帰的に変更

プロセス管理

プログラムの実行されている状態をプロセスといい、プログラムが起動される度に別々のプロセスが作られる。全てのプロセスはカーネルがIDを用いて管理する。カーネルが起動する init プロセスを除く全てのプロセスは、自分を起動したプロセスを親として持ち、親の環境変数やカレントディレクトリを継承する。

ジョブとはシェルが起動した一連のプロセス(プロセスグループ)のことであり、ジョブ番号によって管理される。複数のコマンドを { list } や ( list ) を用いて括ることで単一のジョブとして実行することができる。ジョブ番号の代わりに + を用いると現在のジョブ、- を用いると直前のジョブを表す。なお、& を後につけてコマンドを実行した際には、そのプロセスのジョブ番号とプロセスIDが表示される。

プロセス管理に関連するコマンドは以下である。

ps [axluew]
その端末から起動した現存するプロセスのプロセスIDなどの状態を出力する。現存する全てのプロセスを調べたいときは、ps axuw とすればよい(SystemV系では ps -ef を使う)。
a : 他のユーザが起動したプロセスも出力
x : 制御端末のないプロセス(デーモンなど)も出力
l : 親プロセスやグループIDや優先順位などの詳細情報も出力
u : ユーザ名やCPUの負荷などのユーザ情報も出力
e : 環境変数も出力
w : 画面に入り切らないコマンド名を右端で切らない
jobs
そのシェルが起動したジョブの一覧と、そのジョブ番号、状態、コマンド名を出力する。
kill [signal] pid
プロセスにシグナルを送る。% をつけたジョブ番号を用いると、ジョブに送信することもできる。signal は以下のものを用いるが、省略した場合は -TERM になる。kill -l でシグナルのリストが見られる。名前で指定して kill する killall もある。
-HUP : 制御端末や制御プロセスの死
-TERM : 通常の終了要求
-INT : 端末からの割り込み終了要求(Ctl-c)
-QUIT : 端末からの中止要求(Ctl-\)。core ファイル(メモリ状態の記録)を出力
-KILL : 強制終了。-9 でもよい
-TSTP : 端末からの一時停止要求(Ctl-z)
-STOP : 強制一時停止
-CONT : 停止プロセスへの再開要求
pgrep [-lx] name
コマンド名に name を含むプロセスのIDをリスト表示する。マッチしたプロセスにシグナルを送る pkill もある。
-l : コマンド名も表示する。
-x : 名前が完全一致するものを表示する。
fg %jobnumber
停止中またはバックグラウンドのジョブをフォアグラウンドで動作させる。fg を省略して、単にジョブ指定だけを入力しても同様の効果が得られる。
bg %jobnumber
停止中のジョブをバックグラウンドで動作させ、そのジョブ番号を出力する。
sleep number
number 秒間何もしない。通常は sleep 60 ; clear などとして、プロセスの実行を遅れさせるのに使う。マイクロ秒単位で遅延させる usleep もある。
uptime
システムの稼働時間と付加を出力する。
nice [-number] command
スケジューリング(CPU占有)の優先度を変更して、コマンドを実行。ただし、優先度を上げられるのはスーパーユーザだけ。既に動いているプロセスに対しては renice を使う。
-number : 優先度を -20(最高)から 19(最低)の間で設定。省略すると 10 になる。
nohup command
端末から切り離してコマンドを実行する。ログアウトしても実行は続行される。
at time
指定した時間に標準入力から読み込んだスクリプトの実行を開始する。time は例えば 1520 であれば次の午後3時20分が指定される。ジョブの出力はメールで送られてくる。at に登録したジョブを一覧するには atq を使い、登録を解除するには atrm を使う。
crontab [-ulre] [file]
定期的なコマンド実行を登録する。file の内容は、秒、時、日、月、曜日の指定を空白で区切った後に実行コマンドを置いた行を列挙しておく。指定しないフィールドには * を使う。毎分、毎時、毎日の例を以下に示す。
*/1 * * * * wall hello
00 * * * * wall hello
00 00 * * * wall hello
オプションには以下のものがある。
-u user : コマンドを実行するユーザを指定
-l : 現在の登録状況を出力
-r : 現在の登録を抹消
-e : エディタを起動して登録ファイルを修正
fuser [-v] file
ファイルやソケットを使用しているプロセスのリストを出力する。
-v : 詳細な情報を出力

システム起動時には、最初に /sbin/init というプロセスが作られる。init は /etc/inittab を読んでランレベルを決定する。ただし、起動オプションでランレベルが指定された場合はそれが優先する。次に、init は rc.sysinit を実行してシステムの初期化を行う(/etc/sysconfig/network 等はここで実行される)。最後に、init はランレベルに対応した引数を与えて /etc/rc を実行し、各種の初期化やデーモンプロセスの立ち上げを行う。rc はその引数に基づいて、/etc/rcx.d ディレクトリ(x はランレベルの文字)を調べ、その中の S で始まるコマンドに start という引数をつけて実行する。S で始まるコマンドの名前には S の直後に2桁の数字がつけられているが、その数字が小さい順に実行される。S99local というコマンドがあるが、これは /etc/rc.local を実行する。起動時に何か実行したい処理がある場合は、この rc.local に書けばよい。

shutdown コマンド等でシステムの停止処理を行った際は、ランレベルが 0 に移行する。ランレベルが移行する前には、init は /etc/rcx.d ディレクトリ(x は現在のランレベル)の中を調べ、その中の K で始まるコマンドに stop という引数をつけて実行する。起動する順序は S のコマンド群と同じである。そして、現在実行中で新たなランレベルで定義されていない全てのプロセスに SIGTERM シグナルが警告として送られ、その5秒後に SIGKILL シグナルが送られて強制終了する。ランレベル 0 の場合は全てのプロセスが終了し、その後、システム自体も停止する。

telinit level
ランレベルを変更する。init でも同じ。level には以下のものを用いる。
0 : シャットダウン
1 : シングルユーザモード
2 : NFSなしのマルチユーザモード
3 : マルチユーザモード。通常起動時はこれ
4 : (未定義)
5 : Xからログインするマルチユーザモード
6 : リブート
shutdown [-rh] time
システムを終了する。デフォルトでは、シングルユーザモードに移行する。time は何分後に終了するかを指定。通常のシステム終了の際は、shutdown -h now を使えばよい。
-r : 終了した後、再起動する。reboot でも同じ
-h : 終了した後、電源を落すか、電源を落せる状態にする。halt でも同じ
sync
ファイルシステムのバッファの全内容をディスクに書き込んで同期させる。

デバイス管理

デバイスファイルはフロッピーディスクが /dev/fd0 で、CD-ROMが /dev/cdrom/ であり、各々のマウントポイントは /mnt/floppy と /mnt/cdrom を通常は使用する。新しいフロッピーディスクを使う場合は、フォーマットしてから、ファイルシステムを構築しなければならない。

ハードディスクのデバイスファイルの名前は、IDE接続なら hd 、SCSI接続なら sd で始まり、次に装置番号をアルファベットに置き換えたものが続き、最後にパーティション番号がつく。例えば、第1IDEハードディスクのパーティション1のデバイスファイルは /dev/hda1 である。マウントポイントは /mnt の中に mkdir で予め作っておく。

デバイス管理に関連するコマンドは以下である。

mount [-tro] [devicefile [mountpoint]]
ディスクをマウントする。ファイルシステムのタイプは通常は自動判別される。引数を与えない場合、現在のマウント状況を出力する。
-t type : ファイルシステムのタイプを指定。type は ext2(Linux)、vfat(Windows)、msdos(MS-DOS)、iso9660(ISO9660準拠)などを指定
-r : 読み出し専用でマウント
-o options : マウントオプションをカンマ区切りで指定。users(他のユーザもアンマウントできる)、ro(読み込み専用)など
通常は、mount -t ext2 -r /dev/cdrom/ /mnt/cdrom でCD-ROMを、mount -t ext2 /dev/fd0 /mnt/floppy でフロッピーをマウント
nfsで接続したファイルシステムをマウントする場合は、mount -t nfs host:devicefile mountpoint とする
RAMディスクをマウントする場合は、mount -t tmpfs -o size=64m /dev/shm /mnt/ram などとする
umount mountpoint
マウントしてあるファイルシステムをアンマウントする。アンマウントしていないメディアをイジェクトボタンを押すなどして無理に取り出してはならない。なお、イジェクトボタンが作動しない場合は、eject コマンドを使う。
通常は、umount /mnt/cdrom でCD-ROMを、umount /mnt/floppy でフロッピーをアンマウント
fdformat devicefile
フロッピーディスクの物理フォーマットを行う。
通常は、fdformat /dev/fd0H1440 とすればよい
mkfs [-t] devicefile [blocks]
ファイルシステムを構築する。
-t type : ファイルシステムのタイプを指定(/sbin/mkfs.type という名のプログラムがあるもの)
フロッピーディスクに対しては通常、mkfs -t ext2 /dev/fd0 1440 とするか、MS-DOS形式なら mkfs -t msdos /dev/fd0 1440 とする。
fsck [filesystem ...]
ディスクシステムの整合性を検査し、異常があれば修復を試みる。filesystem は /dev 以下にある特殊ファイルで指定するが、省略すると全てのファイルシステムを対象とする。
dd [if=source] [of=target] [bs=bytes]
バイトイメージのコピーを行う。sourcetarget は入力元と出力もとのイメージファイルやデバイスファイルを指定し、省略すれ標準入力と標準出力を用いる。bytes はコピーするバイト数を指定するが、k(キロ)等の単位をつけてもよい。例えばフロッピーディスクのイメージファイルを作る時は dd if=/dev/fd0 of=hoge.img bs=1440k とし、そのイメージからフロッピーを復元する時は dd if=hoge.img of=/dev/fd0 bs=1440k とすればよい。
apm [-sS]
ノートPCの電池の残量を表示する。
-S : スタンバイモードに移行
-s : サスペンドモードに移行
lilo [-Dd]
ブートローダを書き換える。/etc/lilo.conf があればそれに基づいて設定する。マスターブートレコーダ(/dev/hda)にLILOをインストールし、第1パーティション(/dev/hda1)のWindowsと第3パーティション(/dev/hda3)のLinuxのデュアルブート構成にしたい場合は、/etc/lilo.conf を以下のようにする。なお、lba32 というオプションは、1024シリンダ以上にあるブートセクタをロードするために必要となる。
lba32
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=5000
default=linux

image=/boot/vmlinuz-2.2.16-1k7
  label=linux
  read-only
  root=/dev/hda3

other=/dev/hda1
  label=win
オプションには以下のものがある。
-v label : 設定する内容を表示
-t label : -v とともに用いて、ブートローダの書き変えをせずに設定項目を表示

ディスクのマウント方法は、/etc/fstab に以下のように定義される。各行が各デバイスに対応しており、各フィールドにデバイスファイル名、マウントポイント、ファイルシステムタイプ、マウントオプション、fsckパラメータ、dumpパラメータが書かれる。この設定は、mount コマンドでオプションを省略した場合のデフォルトになる。オプションは、ハードディスクの場合はデフォルトの設定が適用されるように defaults を指定する。フロッピーやCD-ROMの場合は起動時にマウントする必要がないので noauto とする。ro は読み込み専用の指定で、user があると root 以外のユーザでもマウント操作ができるようになり、noatime があると最終アクセスタイムの記録を省いて高速化がなされる。

/dev/sda1           /                   ext2    defaults,noatime      1 1
/dev/sdb7           swap                swap    defaults              0 0
/dev/fd0            /mnt/floppy         ext2    noauto,user           0 0
/dev/cdrom          /mnt/cdrom          iso9660 noauto,ro,user        0 0
none                /proc               proc    defaults              0 0
none                /dev/pts            devpts  gid=5,mode=620        0 0

ネットワークで接続されたマシンの特定のディレクトリを、あたかも自分のファイルシステムの一部としてマウントする仕組みをNFS(ネットワークファイルシステム)という。自分が持つディレクトリのマウントを許可する側をNFSサーバ、それをマウントする側をNFSクライアントと言う。NFSサーバにおける許可設定は、/etc/exports に以下のように、ディレクトリの絶対パスと、許可するホスト名を空白で区切って並べる。ホスト名の後ろには、読み書き可能なら (rw) 、読み込み専用なら (ro) をつける。

/home           arstp042(rw) arstp003(ro)

NFSサーバの起動は、/etc/rc.d/init.d/nfs start とし、終了は /etc/rc.d/init.d/nfs stop とすればよい。あるいはシステム起動時にNFSサーバも自動起動したい場合は、/etc/rc.d/rc.local に以下を書き加えればよい。

if [ -f /etc/rc.d/init.d/nfs ]; then
  /etc/rc.d/init.d/nfs start
fi

NFSクライアントでは、mount コマンドを使って、サーバに許可されたディレクトリをマウントすることができる。あるいはシステム起動時に自動的にマウントしたい場合は、/etc/fstab に以下ような行を加えればよい。冒頭の2つのフィールドはそれぞれ、サーバ名と対象ディレクトリ、マウントポイントを表す。rw の部分は読み書き可能なことを示し、ro なら読み込み専用になる。その他の項目は以下と全く同じでよい。

arstp040:/home      /home               nfs     rw                    0 0

アーカイブ

他人に配布したり、バックアップをとるために、複数のファイルを一つにまとめることをアーカイブという。アーカイブに関連するコマンドは以下である。

tar operation
複数のファイルやディレクトリを一つのtar形式のファイルに格納する。あるいはtar形式のファイルからの抽出を行う。operation は以下のものを用いる(c か x か t のどれかは必須で、残りはオプション)。
c file : 格納モードに指定し、作成するファイル(デバイス)の名前を指定。- を指定すると標準出力
x : 抽出モードに指定。ファイルを指定して取り出すこともできる
t : アーカイブが含むファイルをリスト
z : 格納の際は、tarの上にgz形式で圧縮。抽出の際は、gzを復元してからtarの抽出を行う
Z : 格納の際は、tarの上にZ形式で圧縮。抽出の際は、Zを復元してからtarの抽出を行う
v : 格納や抽出の途中経過を出力
p : 抽出する際にパーミッションもコピーする
f : 最初のファイル指定を格納あるいは抽出の対象にする
以下の使い方を知っていればよい。
格納には通常、tar cvf archive souces ... を用いる
抽出には通常、tar xvf archive を用いる
特定のファイルやディレクトリだけ取り出すには通常、tar xvf archive path ... を用いる。path には、抽出すべきファイル名を列挙し、ワイルドカード * を使ってもよい(シェルと違い . で始まる名前にもマッチする)
tar.gz ファイルを展開する慣用句は gzip -dc hoge.tar.gz | tar xvf - である
cpio operation
複数のファイルやディレクトリを一つのcpio形式のファイルに格納する。あるいはcpio形式のファイルからの抽出を行う。operation は以下のものを用いる。(-o か -i か -p のどれかは必須で、残りはオプション)。
-o : コピーアウトモードに指定。格納すべきファイル名を改行で区切ったリストを標準入力から読み込み、アーカイブファイルを標準出力に書き出す。
-i : コピーインモードに指定。アーカイブファイルを標準入力から読み込み、含まれるファイル群をカレントディレクトリに展開する。
-p directory : コピーパスモードに指定。コピーすべきファイル名を改行で区切ったリストを標準入力から読み込み、それらを directory で指定したディレクトリの中に展開する。
-v : コピーの途中結果を出力
以下の使い方を知っていればよい。
あるディレクトリのコピーアウトには通常、find source -depth | cpio -o > archive とする。
あるアーカイブのコピーアウトには通常、cpio -i < archive とする。
あるディレクトリの別のディレクトリの中へのコピーパスには通常、find source | cpio -o > destination とする。
gzip [-rc] file ...
ファイルをgz形式に圧縮する。元のファイルは末尾に接尾辞 .gz をつけた名前の新しいファイルに置き換えられる。
-r : ディレクトリの中を再帰的に探索し、個々のファイルを圧縮する
-c : 元のファイルを変更せずに、結果を標準出力に出力
gunzip [-Src] file ...
gz形式とzip形式とZ形式のファイルを復元する。元のファイルは名前から接尾辞を削った名前の新しいファイルに置き換えられる。
-S suffix : ファイル名の接尾辞が .gz や .Z でない場合にその接尾辞を指定する
-r : ディレクトリの中を再帰的に探索し、個々のファイルを復元する
-c : 元のファイルを変更せずに、結果を標準出力に出力
zcat file ...
Z形式やgz形式のテキストファイルの中身を出力する。
bzip2 [-rc] file ...
ファイルをbz2形式に圧縮する。元のファイルは末尾に接尾辞 .bz2 をつけた名前の新しいファイルに置き換えられる。
-r : ディレクトリの中を再帰的に探索し、個々のファイルを圧縮する
-c : 元のファイルを変更せずに、結果を標準出力に出力
bunzip2 [-rc] file ...
bz2形式のファイルを復元する。元のファイルは名前から接尾辞を削った名前の新しいファイルに置き換えられる。
-r : ディレクトリの中を再帰的に探索し、個々のファイルを復元する
-c : 元のファイルを変更せずに、結果を標準出力に出力
compress file ...
ファイルをZ形式に圧縮する。元のファイルは末尾に接尾辞 .Z をつけた名前の新しいファイルに置き換えられる。
uncompress file ...
Z形式のファイルを復元する。元のファイルは名前から接尾辞を削った名前の新しいファイルに置き換えられる。
zip [-r] archive source ...
ファイルをzip形式に圧縮する。
-r : ディレクトリを圧縮
unzip file ...
zip形式のファイルを復元する。
lha mode file ...
ファイルやディレクトリをlzh形式に圧縮する。あるいはその復元を行う。mode は以下のものを用いるが、省略した場合は書庫の内容を出力する。
c file : 圧縮モードに指定し、作成するファイル名を指定
x : ファイルを復元
shar file ...
ファイルをシェルアーカイブ形式にして出力する。シェルアーカイブを復元する際は、sh でそのファイルを実行してやればよい。-L によるファイル分割は -o と同時に使う必要があり、filename.nn という形式に保存されるが、それを結合する際は全てのファイルを実行すればよい。
-o filename : 出力先を指定のファイル名に変更
-L size : 指定のサイズ(キロバイト単位)でファイルを分割
md5sum [-c] [file]
ファイルからMD5形式のチェックサムを作成する。file は読み込むファイルを指定し、なければ標準入力を読み込む。
-c sumfile : チェックサムを使って検査
mmencode [-qu] [file]
Base64形式とquoted-printable形式のファイルのエンコードかデコードを行った結果を出力する。デフォルトではBase64のエンコードを行う。file が省略された場合は標準入力を読み込む。
-q : quoted-printable形式のモードになる
-u : デコードモードになる
split [-lb] [file]
ファイルを指定した1000行ごとに分割して保存する。file が - であったり、省略されると、標準入力を読み込む。出力は xaa xab xac ... といった名前になる。結合する時は、cat x[a-z][a-z] > hoge などとすればよい。
-l num : 各分割ファイルの行数を指定。
-b num : 各分割ファイルのサイズをバイト数で指定。数字の末尾に k をつけるとキロバイト単位、m をつけるとメガバイト単位になる。
uudecode [-o] [file]
uuencode形式のファイルをデコードしたファイルを作成する。file が省略された場合は標準入力を読み込む。
-o filename : 出力先を指定のファイル名に変更
rpm expression
rpm形式パッケージの管理ツール。rpm -ivh packagefile でインストール。既存のパッケージを置き換える場合は、rpm -ivh --force packagefile を用いる。rpm -e packagename でパッケージをアンインストールする。rpm -qa でインストールされたパッケージの一覧を出力する。rpm -qip packagefile でパッケージファイルの説明を出力する。rpm -qlp packagefile でパッケージファイルに含まれるファイルの一覧を出力する。

ネットワーク

システムの起動時には /etc/sysconfig/network が実行され、それによってネットワークの設定がなされる。ここでは以下のようにドメインやホスト名などを記述する。

NETWORKING=yes
HOSTNAME=santiago.kamikaze.go.jp
DOMAINNAME=kamikaze.go.jp
GATEWAY=192.168.1.254

/etc/sysconfig/network は /etc/sysconfig/network-scripts ディレクトリにある ifcfg- で始まるスクリプトを実行する。通常は ifcfg-eth0 が存在するので、それを自分の環境に合わせて設定しなおす。以下のように、IPアドレス等を設定する。

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.1.99
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
USERCTL=no

DHCPを使って動的にIPアドレスやDNSサーバを割り当てる場合は、上記の代わりに、以下のように書けばよい。

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

次に、名前解決(IPアドレスとホスト名の相互変換)の方向を /etc/host.conf に以下のように記述する(新しいシステムでは、/etc/nsswitch.conf が使われる)。以下の例では、まずローカルの設定ファイルを見てからDNSに問い合わせるようになる。

order hosts,bind

DNSに問い合わせる前に参照される名前解決の設定ファイルは /etc/hosts である。それは以下のように、各行にIPアドレス、正式なホスト名、エイリアスを列挙する。エイリアスはなくてもよいし、複数あってもよい。

127.0.0.1       localhost.localdomain     localhost
192.168.1.99    santiago.kamikaze.go.jp   santiago
192.168.1.10    banzai.kamikaze.go.jp     banzai
192.168.1.11    sukiyaki.kamikaze.go.jp   sukiyaki
192.168.1.12    harakiri.kamikaze.go.jp   harakiri

DNSを利用する場合は、/etc/resolv.conf でその設定を行う。DNSは3つまで指定できる。search の項は、ドメイン名が省略された際にそれを補完するために用いられる。以下の例の options の項は、要求のタイムアウトが1秒で、それを2回試みることを意味する。

nameserver 192.168.1.4
nameserver 192.168.1.5
nameserver 192.168.1.6
search kamikaze.go.jp
options timeout:1 attempts:2

/etc/sysconfig/network-scripts 以下のファイルを書き換えた場合は、/etc/sysconfig/network restart としてネットワークインタフェースを再起動する必要がある。それ以外の設定ファイルは、書き換えたら即座に反映される。

ネットワーク利用に関連するコマンドは以下である。

hostname [-di] [hostname]
システムのホスト名を出力する。環境変数 HOSTNAME の出典となる。スーパーユーザは hostname を指定してホスト名を変更できる。
-a : ホストの別名を出力
-d : ホストのドメイン名を出力
-i : ホストのIPアドレスを出力
host hostname
DNSを使って、ホスト名からIPアドレス、もしくはIPアドレスからホスト名を調べる。
ifconfig [interface [setting]]
ネットワークインタフェースの設定と確認を行う。引数が何もない場合は全てのインタフェース、interface がある場合はそれを表示する。setting がある場合はその設定を行う。ホストのIPアドレスを知りたい場合には通常このコマンドを用いる。IPアドレスを設定したい場合は ifconfig eth0 192.168.2.55 などとし、ネットマスクを設定したい場合は ifconfig eth0 netmask 255.255.0.0 などとし、使用不能にしたい場合は ifconfig eth0 down とすればよい。
route [setting]
ルーティングの設定と確認を行う。引数がない場合は現在のルーティング情報を出力する。デフォルトゲートウェイを設定する場合は、route add default gw 192.168.1.254 などとすればよい。
netstat [-rap]
現在のネットワークサービス(ソケット)の稼働状況や統計情報を出力する。
-r : 経路情報を表示
-a : 待機状態のサーバも含めた全てのソケットを表示
-p : プロセスIDとプログラム名も表示
arp [-ads]
ARPキャッシュ(IPアドレスとMACアドレスの対応表)の確認と変更を行う。
-a [hostname]: 指定したホストか、全てのエントリを表示
-d hostname: 指定したホストのエントリを削除
-s hostname macaddr : 指定したホストのアドレスを設定
talk user [tty]
別のログインユーザと対話する。user はローカルホストであればユーザ名のみ、リモートホストであれば、tako@kantei.go.jp のようにホスト名も指定する。tty は書き込み対象端末の名前を指定する。
write user [tty]
別のログインユーザにメッセージを送る。tty は書き込み対象端末の名前を指定。ログインしている全ユーザに送る wall コマンドもある。
mesg [y|n]
他のユーザによる自分の端末へアクセス許可を出力する。y または n が指定された場合は、それを許可あるいは不許可に変更する。主に talk や write の許可あるいは拒否に用いる。
telnet [host [port]]
他のシステムにTCP/IP接続する。ポートはデフォルトで 23(telnet接続)。host を省略した場合や、Telnetのプロクシに接続した場合は、以下のサブコマンドを用いる。
open host : ホストに接続する
close : 接続を切断する
quit : 接続を切断し、終了する
? command : コマンド一覧かヘルプを表示する
ftp [host]
他のシステムとファイルの送受信をする。ログインした後は以下のコマンドを使うことができる。
open host : 指定したホストに接続する
close : ホストとの接続を閉じる
ascii : アスキーモードにする
binary : バイナリモードにする
get file : リモート側のファイルをローカル側のカレントディレクトリにコピーする
mget file ... : 複数のファイルを get する。* をワイルドカードとして使える
put file : ローカル側のファイルをリモート側のカレントディレクトリにコピーする
mput file ... : 複数のファイルを pu する。* をワイルドカードとして使える
cd file : リモート側での cd
ls file : リモート側での ls
delete file : リモート側での rm
mkdir directory : リモート側での mkdir
rmdir directory : リモート側での rmdir
lcd directory : ローカル側での cd
! command : ローカル側で任意のコマンドを実行
quit : 終了する
? command : コマンド一覧かヘルプを表示する
ncftp [-u] [host]
ftp の強化版。ftp と同じコマンドが使え、コンプリションもできる。ローカル側で ls をする lls というコマンドもある。接続を閉じる時にブックマークを作っておくと、hostの代わりにそれを指定してその設定を使える。get や put コマンドに -R オプションを付けて get -R hoge などとするとディレクトリを中身ごと送受信できる。
-u user : リモート側でのユーザ名。省略すると、anonymous になる
rlogin [-l] host
他のシステムにリモートログインする。ログイン先のホームの .rhosts に以下のように書き加えて自ホストとユーザ名を登録しておく必要がある。あるいは全ユーザの共通の設定は /etc/hosts.equiv で行う。これらのパーミッションは 600 にしておくこと。なお、rlogin の制御から抜けるには、~ を押してから . を押せばよい。
santiago.kamikaze.go.jp       sukiyaki
santiago                      sukiyaki
オプションには以下のものがある。
-l user : リモートホストでのユーザ名。省略すると、自ホストのユーザ名を使用
rsh host command
リモートホスト上でコマンドを実行し、その標準出力をローカルホストの標準出力として扱う。rlogin と同じく、リモートホストは .rhosts によって認証を行う。
-l user : リモートホストでのユーザ名。省略すると、自ホストのユーザ名を使用
rcp [-r] source ... dest
cp のネットワーク版。sourcedest とも、user@hostname:path の形式で、リモートホストのファイルを指定できる。rlogin と同じく、リモートホストは .rhosts によって認証を行う。リモート側での相対パスはホームディレクトリを基準とする。
-r : ディレクトリを中身ごとコピーする
rdate [-s] hostname
リモートホストから現在時刻を得て表示する。
-s : ローカルホストの現在時刻をリモートホストのものに会わせる
slogin [-l] host
暗号化通信を使って他のシステムにリモートログインする。rlogin と使い方はほぼ同じ。
-l user : リモートホストでのユーザ名。省略すると、自ホストのユーザ名を使用
ssh [-l] host
暗号化通信を使ってリモートホスト上でコマンドを実行し、その標準出力をローカルホストの標準出力として扱う。使い方は rsh とほぼ同じ。
-l user : リモートホストでのユーザ名。省略すると、自ホストのユーザ名を使用
sftp [host]
暗号化通信を使って他のシステムとファイルの送受信をする。使い方は ftp とほぼ同じ。
mail [mailaddress]
標準メーラ。標準入力をメールとして送信する。mailaddress を省くと、届いたメールを閲覧。閲覧時には以下のサブコマンドを用いる。
p : メールを再表示
d : メールを削除
s file: メッセージをファイルに保存
q : 終了
nslookup [host]
指定したホストのネットワークアドレスを出力する。host にホスト名を指定した場合はIPアドレスを、IPアドレスを指定した場合はホスト名を出力する。何も指定しない場合は対話モードとなる。
ping host
ICMPを用いて、IP接続されたリモートマシンの応答を確認する。
traceroute host
指定したホストへIPパケットが送られる経路を表示する。
whois [-h] name
NIC等に登録されたドメイン名を検索する。name にはURLの一部か、IPアドレスを用いる。
-h hostname : WHOISサーバを指定する。JPNICなら whois.nic.ad.jp にする
tcpdump [-wx] [condition]
ネットワークのトラフィックをダンプする。デフォルトでは、全てのパケットのヘッダ情報を出力する。condition が指定された場合、パケットをその条件式に当てはまるもののみにフィルタリングする。例えば、ホスト santiago の任意のポートからホスト lima のポート 23 番に送られたパケットの情報を得るには、tcpdump src host santiago and dst host lima dst port 23 とすればよい。ホスト santiago とホスト lima の間の全てのパケットの情報を得るには、tcpdump host santiago and host lima とすればよい。
-w file : パケットの中身を連結してファイルに書き出す
-x : パケットの中身を16進数にして出力
wget [options] [url ...]
指定したURLのFTPまたはHTTPのコネクション出力をファイルに保存する。プロキシ等の設定は、ホームディレクトリに .wgetrc というファイルを作って、以下のように書いておく。
http_proxy = proxy.kamikaze.go.jp:3128
ftp_proxy = proxy.kamikaze.go.jp:3128
use_proxy = on
no_proxy = kamikaze.go.jp,localdomain
user-agent = Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
オプションには以下のものがある。
-i file : ファイルからURLのリストを取得
-t number : 失敗した時の再試行回数を指定。0 だと無限
-nc : 既にローカルに存在するファイルをダウンロードしない
-nd : ディレクトリを作らないで全てカレントディレクトリに保存
-r : 取得したファイルに含まれるリンク先を再帰的に取得
-l number: 再帰取得の深さを指定。0 で無制限。デフォルトは5階層
-A exts : 再帰取得の際、取得するファイルの拡張子を指定。複数の場合は -A jpg,gif のようにコンマで区切る
-L : 再帰取得の際、相対リンクのみを取得
-I path : そのパス(サイトのトップを / とした絶対パス)以下のファイルのみを取得する。複数を指定する場合は -I /cgi-bin,/images のようにコンマで区切る。
-p : HTMLファイルから参照されるイメージやスタイルシートも同時に取得
--follow-ftp : 再帰取得の際、FTPのリンクも取得
-np : 再帰取得の際、親ディレクトリを取得しない
-Y off : 一時的にプロクシを使用しない
--http-user=user : HTTP認証のユーザ名を指定
--http-passwd=passwd : HTTP認証のパスワードを指定
--header=header : HTTPヘッダを追加する。Referer を偽装する場合は、--header="Referer: /index.html" などとする(-U agentname としても同じだが)
-e "statement" : .wgetrc で書くべき指定を行う
-S : サーバからのレスポンスヘッダを表示する
-Q size : 取得するデータの総量を制限する。50キロバイトなら 50k、5メガバイトなら 5m
lynx [url]
テキスト系WWWブラウザ。url は初期ページのURLを指定する。設定は ~/.lynxrc でなされる。プロクシの設定は、環境変数 http_proxy に http://proxy.kamikaze.go.jp:3128/ のようにURLを指定して行う。また、ローカルドメインにプロクシを使いたくないなら、環境変数 no_proxy に kamikaze.go.jp のようにドメイン名を指定する。使い勝手は w3m の方がよい。

各ユーザに電子メールが届いた際には、そのデータは各ユーザのスプール(/var/spool/mail/username)に貯められる。転送設定はホームディレクトリの .forward というファイルで行い、転送先をカンマまたは改行で区切って並べる。ローカルユーザ名を指定すると、そのユーザのスプールに貯められる。転送するが自分のスプールにもデータを残したい場合は、転送先に自分を指定することになるが、その場合は転送が無限ループしないように、ユーザ名の前に \ を書いてさらなる転送を抑止するようにしなければならない。ファイル名を指定すると、データがそこで指定したファイルの末尾に追加される。コマンドの指定は "| commandline" という書式にする。コマンドを指定した場合、そのコマンドラインの標準入力にデータが渡されることになる。ファイルやコマンドのパスは絶対パスにする必要がある。以下の例では、自分のスプールにデータを残し、tycoon@kamikaze.go.jp に転送し、ホームディレクトリの mailbackup に追加し、自分の端末にデータを表示する。

\sergeant,tycoon@kamikaze.go.jp,/home/sergeant/mailbackup,"|write sergeant"

環境設定

シェルの中で用いる変数には、親プロセスから受け継いだ環境変数の他に、そのシェルプロセスでのみ通用するシェル変数がある。シェル変数は HOGE=hogehoge のように、名前の直後にメタキャラ = を置くことで定義される。変数の初期値は空文字列だが、= の直後に文字列を置けば、それが値として代入される。なお、シェル変数も環境変数もデータ型は全て文字列である。シェル変数はデフォルトでは子プロセスには継承されないが、export コマンドで指定することで継承を指示することができる。

複数のプロセスで共有する設定情報は、環境変数をリレーすることで実現される。ユーザが起動するプロセスはシェルの子プロセスとして作成され、子プロセスは親プロセスの環境変数を引き継ぐので、環境変数の設定はシェルが行えばよいことになる。bash が起動する際にも、親プロセスの環境変数を暗黙裡に継承する。継承した値は参照したり変更することができ、子プロセスを生成した場合は、その時点での値を継承させる。以下はよく用いられる環境変数の例である。

HOMEホームディレクトリ(/etc/passwd で指定)
SHELLログインシェル(/etc/passwd で指定)
USERユーザ名。
PATHコマンドサーチパス。パスを : で区切って列挙
PS1第1プロンプト。"\h[\w]\\$ " などのエスケープも使える
PS2第2プロンプト。コマンド入力が継続している時に出る
TERM端末が設定する情報。vt100 や kterm や linux
TERMCAP/etc/termcap を参照し、TERM に応じた設定がなされる
LANG使用する言語と文字コード。/usr/share/locale にあるディレクトリの名前に一致
LC_ALL使用する言語と文字コード。LANG と同じ値にしておく
PAGERman 等が用いるページャ。通常、less か more
EDITORless 等が用いるスクリーンエディタ。通常、vi か emacs -nw
MANPATHオンラインマニュアルのサーチパス。パスを : で区切って列挙
MAIL届いたメールを保存するファイル名

シェルの初期設定は、起動時に自動的に読み込まれるシェルスクリプトによって行う。bash がログインシェルとして起動した際には、/etc/profile が実行され、次に ~/.bash_profile が実行される。ログイン時以外で、対話的シェルとして起動された時や rsh やXアプリケーション等で bash が起動された場合は、~/.bashrc(変数 BASH_ENV で指定)が実行される。したがって、全ユーザ共通の設定を /etc/profile に、tty に関する設定を ~/.bash_profile に、その他の設定を ~/.bashrc に書くのがよい。また、キーバインド等の入力設定は、~/.inputrc(変数 INPUTRC で指定)でなされる。ログアウト時には .bash_logout が実行される。

環境設定に関連するコマンドは以下である。

export [-n] [ name[=value] ...]
変数を環境変数として継承するように指定する。name で指定した変数がなければ新規に作成する。=value を付けると、値の代入も同時に行う。
-n : 変数の継承指定を解除
-p : 環境変数のリストを表示。単に export としても同じ
printenv name ...
環境変数とその値を出力する。name を省略すると全ての環境変数を一覧の出力する。
env [name=value ...] [ command [arg ...] ]
環境変数を一時的に設定して、コマンドを実行する。
set [args ...]
args がない場合は変数の一覧を出力する。args は位置付きパラメータ 1 、2 ... n に代入される。
unset name ...
定義された変数を削除する。
stty [setting]
端末の設定を変更する。setting には、端末入力の項にある erase のような語に続けて、スペースを空けて、その後にその機能を割り当てたいキー入力を指定するとキーバインドの変更ができる。既に機能文字に割り当てられているキーを指定するには、Ctl-q を入力してから入力すればよい。例えば、BackSpaceキーを1文字消去に割り当てたい場合は、stty erase ^H となる。キーバインドの変更以外では、-echo とすると入力文字のエコーバックを抑制し( - を付けないと逆の効果)、raw とすると端末の入力加工(バッファリングやエラーチェック等)を抑制し、cooked とすると raw の効果を打ち消す。sane とすると、通常の状態に戻る。setting を省略すると現在の設定をの一部を表示するが、-a オプションを付けるとより詳細に表示する。
alias [name='text' ...]
コマンドのエイリアス(別名)を作成する。name='text' を省略すると存在する全てのエイリアスを出力し、='text' のみを省略するとそのエイリアスを出力。
unalias [-a] [name ...]
作成したエイリアスを無効にする。なお、一時的にエイリアスを無効化する場合は、\ls のように、\ をつけてコマンドを実行すればよい。
-a : 全てのエイリアスを無効化
type name ...
コマンドがシェルによってどう解釈されるかを示す。
umask [mask]
新規ファイルのパーミッションをマスクする。通常は 022 でよい。mode を省略すると現在のマスクモードを表示。
ulimit [options]
シェルとシェルが生成したプロセスが利用できるリソースを制限する。オプションが全くない場合は -f が設定されたとみなす。-S と -H のどちらも無い場合は、どちらも指定されたとみなす。制限を無くす場合は、limit を unlimited とする。
-a : 現在の制限を全て表示
-S : 弱い制限をかける(後で制限を緩和できる)
-H : 強い制限をかける(後で制限を緩和できない)
-f [limit] : 生成するファイルの最大サイズを表示するか、limit に設定する
-c [limit] : 生成する core ファイルの最大サイズを表示するか、limit に設定する
-d [limit] : プロセスのデータ領域の最大サイズを表示するか、limit に設定する
-s [limit] : プロセスのスタック領域の最大サイズを表示するか、limit に設定する
-t [limit] : CPU時間(秒単位)の最大値を設定するか、limit に設定する
source file ...
ファイルのシェルスクリプトをコマンドラインとして実行する。「 . 」でも同じ。

シェルスクリプト

複数のコマンドラインを一つのファイルに書いておけば、シェルにそれを読み込ませるだけで全ての作業を実行してくれる。そうして作られるシェルスクリプトには分岐やループなどの制御構文も使えるので、より柔軟な処理が可能となる。なお、シェルでは 0 を真、0 以外の数値を偽として扱う。

スクリプトファイルに実行許可を与えておけば、コマンドとして使えるようになる。コマンドとして実行した場合、何も書かなければ /bin/sh が実行するが、ファイルの先頭行に #!/bin/bash などと書くことによって実行するシェル(あるいは perl 等のインタープリタ)を指定することもできる。

メタ文字 $ と { } を使って変数の値を取り出す機能をパラメータ展開という。以下の表で、variable は変数名、string は任意の文字列を意味する。置換削除については、string にワイルドカード * を用いることもできる。なお、末尾の .txt を .doc に置換したいなら、${hoge%.txt}.doc とすればよい。

${variable}単に値に展開する。$variable と同じ
${#variable}値の文字数(バイト長)に展開する
${variable:-string}変数がなかったり値が空文字列の場合は string に展開し、そうでなければ元来の値に展開
${variable%string}値の末尾を起点として、string に一致する部分を削除したものに展開。* は最短一致を選択
${variable%%string}値の末尾を起点として、string に一致する部分を削除したものに展開。* は最長一致を選択
${variable#string}値の先頭を起点として、string に一致する部分を削除したものに展開。* は最短一致を選択
${variable##string}値の先頭を起点として、string に一致する部分を削除したものに展開。* は最長一致を選択
$((expression))expression には数値文字列と演算子 | & == < <= > >= + - * / % 等を用い、その値の数値文字列に展開

シェルのコマンドライン引数は位置付きパラメータとして格納される。第1引数は $1、第2引数は $2 といった具合に、$9 まで参照できる。対応する引数のない位置付きパラメータは空文字列になる。$0 はプログラムの名前になる。$# はコマンドライン引数の個数になる(C言語の argc と違ってコマンド自身は数えない)。$* は全てのコマンドライン引数をスペースで区切って正規化した文字列になる。$? は直前に実行したコマンドの終了値になる。$$ はそのシェルのプロセスIDになる。

コマンドライン引数を一つずつ取り出して処理をしたい場合は、$* を for ループで回す構文を用いる。for 文は、in の後に指定した文字列のリストから、一つずつ文字列を取り出して、do から done までを実行していく。以下の例では取り出した引数を変数 str に代入して、それを単に echo で出力している。

for str in $*
do
  echo $str
done

真偽判定による条件分岐は if 文を使う。if 文は直後のコマンドを条件部として、その戻り値が真であれば then 以下を実行し、偽であってかつ else 以下があればそれを実行する。if 文は fi で終らせる。else if の省略である elif という表現もある。if 文は test コマンドと併用して使うことが多い。&& や || を条件部に使うこともできる。条件部の真偽判定を逆にする場合は条件部の前に ! を用いる。以下の例では /etc/bashrc が存在すればそれを実行し、なければエラーメッセージを出力する。

if test -f /etc/bashrc
then
  source /etc/bashrc
else
  echo "File not found."
fi

&& や || のみで条件分岐を実現することもできる。以下の例は上記と同様の動作をする。なお、; と & は && と || よりも評価の優先順位が低いので、それらで組み合わせたコマンドを条件に使いたい場合は { list } や ( list ) を用いる。

test -f /etc/bashrc && source /etc/bashrc || echo "File not found."

単純なループ構文は while 文を用いる。if 文と同様に条件部を後ろに伴い、ループの各回でそれを評価する。条件部が真である限り、do から done までのループを続ける。for や while 文の中では、break 文で即座にループから抜け、continue 文で即座に次のループに移ることができる。以下の例では 1 から 100 までの数字を各行に出力する。

i=1
while test $i -le 100
do
  echo $i
  i=$(($i+1))
done

パターンマッチングによる条件分岐は case 文で行う。case の直後に置かれたワードと一致するパターンに処理が移り、そこから ;; までのリストを実行し、case の後に抜ける。パターンに * を用いると、全てのワードに一致する。パターンを | で区切って、1|2) のように書くと、1 と 2 に一致する。以下の例は月の番号から対応する名前を出力する。

case $1 in
1) echo January ;; 2) echo February ;; 3) echo March ;;
4) echo April ;; 5) echo May ;; 6) echo June ;;
7) echo July ;; 8) echo August ;; 9) echo September ;;
10) echo October ;; 11) echo Nobember ;; 12) echo December ;;
*) echo Unknown ;;
esac

制御構文は入れ子にすることもできる。以下の例は tee コマンドとほぼ同じ働きをする。

rm -f $*
while read
do
  echo $REPLY
  for file in $*
  do
    echo $REPLY >> $file
  done
done

実行中のシェルに対してリダイレクションを行う際は、exec コマンドを用いる。以下の例はそのスクリプト自身を出力する。

exec < $0
cat

シェルスクリプトで関数を定義するには関数名の後ろに () をつけ、その後ろに実行するコマンドを記述した { list } を置けばよい。関数の引数は、関数内で $1 $2 ... を用いて得ることができ、$# は引数の数になる。定義した関数は、そのスクリプトの終りまで、通常のコマンドのように呼び出すことができる。return 文で関数から抜けることができるが、return number とすると戻り値を指定できる。local コマンドを使って変数を定義すると、その変数のスコープはその関数内に制限される。以下の例は、第1引数を第2引数で累乗した数を出力する関数の定義である。呼び出す際は power 3 2 のようにすればよい。よく使う関数はファイルに保存しておき、それを source コマンドを用いて必要なスクリプトで取り込むのが便利である。

power(){
  local n=1
  local val=1
  if test $# -ne 2
  then
    return 1
  fi
  while test $n -le $2
  do
    n=$((n+1))
    val=$((val*$1))
  done
  echo $val
  return 0
}

シェルスクリプトに関連するコマンドは以下である。

test [condition]
ファイル形式のチェックや値の比較を行い、結果を真偽値で返す。contidion には、以下の形式を用いる。condition を省略すると常に偽を返す。condition を [ ] で括って、[ -f /etc/bashrc ] などとしても test コマンドと同じ意味になる。
-e filefile が存在すれば真
-f filefile が存在し、通常のファイルであれば真
-r filefile が存在し、読み込み可能であれば真
-w filefile が存在し、書き込み可能であれば真
-x filefile が存在し、実行可能であれば真
-d filefile が存在し、ディレクトリであれば真
-O filefile が存在し、自分の所有であれば真
file1 -ot file2file1file2 より修正時刻が新しければ真
-n strstr の長さがゼロより大きければ真
str1 == str2str1str2 が等しければ真
str1 != str2str1str2 が等しくなければ真
expr1 -eq expr2expr1expr2 の数値が等しければ真
expr1 -ne expr2expr1expr2 の数値が等しくなければ真
expr1 -lt expr2expr1 の数値が expr2 の数値より大きければ真
expr1 -le expr2expr1 の数値が expr2 の数値より大きいか等しければ真
expr1 -gt expr2expr1 の数値が expr2 の数値より小さければ真
expr1 -ge expr2expr1 の数値が expr2 の数値より小さいか等しければ真
cond1 -a cond2cond1cond2 の両方が真なら真
cond1 -o cond2cond1cond2 のどちらかが真なら真
! condcond が真なら偽、偽なら真
expr expression
echo $((expression)) とほぼ同じ機能を果たす。ただし各々の演算子と披演算子はスペースで区切る必要がある。
read [name ...]
標準入力から1行を読み込む。name を列挙した場合は、空白文字で区切られた単語が各々の名前の変数に代入される。単語が name の数に足りない場合の残りは空文字列になる。name を指定しない場合は、読み込んだ行をシェル変数 REPLY に代入する。まだ読み込む行があれば偽を返し、そうでなければ真を返す。変数 IFS が設定されている場合は、単語はその値に含まれる文字を区切り文字にして分けられる。
-a aname : 読み込んだ行を配列変数として格納する
shift [number]
$2 が 1 に代入され、$3 が 2 に代入されるといった具合に、位置付きパラメータを一つずつずらす。number があればずらす幅を指定する。
eval commandline
引数をシェルのコマンドラインとして実行する。
trap [ [commandline signal ...]
シェルがシグナルを受け取った時に動作するコマンドラインを指定する。commandline が - の場合はシグナルを無視する。引数を全て省略した場合は、全てのシグナルの動作を元に戻す。signal には、HUP や TERM など、kill コマンドのシグナル表現に - をつけないものを用いる。あるいは EXIT とするとそのシェルの終了時に指定したコマンドが実行され、DEBUG とそるとそのシェルが実行した全てのコマンドの終了後に指定したコマンドが実行される。
wait [pid]
子プロセスの終了を待ち、その終了ステータスを返す。pid がある場合はそのプロセスIDのプロセスのみを待ち、ない場合は全ての子プロセスの終了を待つ。
true
何もせず、真を返す。「 : 」でも同じ。
false
何もせず、偽を返す。
exec [command] [redirection]
現在のシェルのプロセスを別のコマンドで置き換える。commandを省略した場合は現在のシェルの実行を続けるが、それに対してのリダイレクションは有効となる。

コマンドリストの戻り値を以下にまとめるが、要するにリスト内で最後に実行したコマンドの戻り値がコマンドリストの戻り値となる。なお、{ list } や ( list ) の戻り値は list のものになる。シェルスクリプトの戻り値は exit number で終了した場合はそこで指定した値になるが、そうでない場合はスクリプト内で最後に実行したコマンドの戻り値が使われる。

command1 | command2 command2 のもの
command1 ; command2 command2 のもの
command & 常に 0
command1 & command2 command2 のもの
command1 && command2 command1command2 の論理和
command1 || command2 command1command2 の論理積

ヒアドキュメントはシェルスクリプトとその標準入力を混在させる機能である。command << pattern の形をとり、以降 pattern のみからなる行までの各行を標準入力として command を実行する。なお、標準入力とみなされる部分でも、メタキャラ $ ` \ は、' に括られていなければ機能する。以下の例ではユーザに対する挨拶文を表示する。

cat << End_of_input
Hello, $USER.
This is $HOSTNAME.
End_of_input

X Window System

Xウィンドウシステム(XFree86)はサーバとクライアントのプロセスからなるが、まずはXサーバを立ち上げてから、その上でクライアントを起動して使用する。Xサーバは端末から xinit で起動する。起動時には ~/.xinitrc が実行されるので、通常そこには初期設定とウィンドウマネージャの呼び出しを記述しておく。以下では、ロケールを日本語に設定し、kinput2 を canna に接続して立ち上げ、CapsLock キーを Control に割り当て、「半角/全角」キーを Meta に割り当て、全てのリモートホストによる画面描画を許可し、かつウィンドウマネージャにWindowMakerを立ち上げる。なお、Xの使用中に Ctl+Alt+Backspace を押すと、Xを強制終了できる。

#!/bin/bash

export LANG='ja_JP.eucJP'
export LANGUAGE="$LANG"
export LC_ALL="$LANG"
export JLESSCHARSET="japanese"

kinput2 -canna &
export XMODIFIERS='@im=kinput2'

xmodmap -e "remove Lock = Caps_Lock"
xmodmap -e "remove Control = Control_L"
xmodmap -e "keysym Control_L = Caps_Lock"
xmodmap -e "keysym Caps_Lock = Control_L"
xmodmap -e "add Lock = Caps_Lock"
xmodmap -e "add Control = Control_L"

xmodmap -e "remove ZenHan = Zenkaku_Hankaku"
xmodmap -e "remove ESCP = Escape"
xmodmap -e "keysym Escape = Zenkaku_Hankaku"
xmodmap -e "keysym Zenkaku_Hankaku = Escape"
xmodmap -e "add ZenHan = Zenkaku_Hankaku"
xmodmap -e "add ESCP = Escape"

xset b off s 3600
xhost +

wmaker

XFree86の設定は /etc/XF86Config ( /usr/X11R6/lib/X11/XF86Config )に書かれるが、それは Xconfigurator や XF86Setup を使って書き出すとよい。なお、解像度に関しては、使用するドライバの Section "Screen" 節の中の Modes コマンドで指定される。1280×1024 の解像度で表示可能な環境であれば、以下のように書いておくとよい。Alt と Control を押しながらテンキーの + キー(逆順なら - キー)を押すと、列挙した解像度を順に切り替えられる。

Modes    "1280x1024" "1152x864" "1024x768" "800x600" "640x480" "512x384"

Xウィンドウシステムに関連するコマンドは以下である。

xinit
Xを立ち上げ、クライアントとして ~/.xinitrc のスクリプトを実行する。スクリプトの実行が終った時点でXも終了する。
startx
xinit を呼び出すが、~/.xinitrc の代わりに、/usr/X11R6/lib/X11/xinit/xinitrc をクライアントとして実行する。
xterm [options]
X標準の端末エミュレータ。ウィンドウ上で、Control を押しながらマウスの3つの各ボタンを押すこと簡単な設定ができる。Shift を押しながら PageUp か PageDown で画面のスクロールができる。
-g widthxheight : ウインドウの大きさを桁数で指定。widthxheight は 100x30 などとする
-fn fontname : 通常のフォントを指定
-fb fontname : 太字のフォントを指定
-bg color : 背景の色を指定
-fg color : 文字の色を指定
-cr color : カーソルの色を指定
-sb color : スクロールバーをつける。+sb だとなくす
-e command : 端末エミュレータ上で指定のコマンドを実行して終了
kterm [options]
xtermのほとんどの機能に加えて、漢字出力可能な端末エミュレータ。オプションも同様で、それに加えて以下を用いる。デフォルトの漢字コードを変えるには ~/.Xdefaults に kterm*kanjiMode: euc または kterm*kanjiMode: sjis などと書けばよい。
-km mode : 漢字モードを指定。EUC(デフォルト)なら euc 、シフトJIS なら sjis を指定
-fl fontlist : 通常のフォントを指定。フォント名をカンマで区切って列挙
-flb fontlist : 太字のフォントを指定。フォント名をカンマで区切って列挙
-lsp number : 行間のスペースをドット数で指定
kinput2 [options ...]
X上で日本語入力する為のサーバ。kinput2 の起動中に Shift + Space を押せば対応アプリケーションで日本語入力に切替えられる。options は -canna や -wnn などとして接続する漢字変換サーバの名前を指定。
twm
X Window標準のウィンドウマネージャTWMを起動する。
wmaker
NEXTSTEPのようなウィンドウマネージャWindow Makerを起動する。~/GNUstep 以下にある設定ファイルが必要なので、~/GNUstep がない場合は wmaker.inst を使って作成しておくこと。GUIの設定は、 /usr/X11R6/lib/GNUstep/Apps/WPrefs.app/WPrefs で、効果音の設定は /usr/X11R6/lib/GNUstep/Apps/WSoundPrefs.app/WSoundPrefs で行う。背景にしたい画像は、/usr/share/WindowMaker/Backgrounds におけばよい。
xon hostname [-user username] command ...
Xサーバが起動しているリモートホストでXアプリケーションを実行する。ユーザ認証は rlogin 等と同様の方法で行われる。username はリモートホストでのユーザ名で、省略すると自ホストのユーザ名を使用する。
xset expr
Xサーバのユーザ設定を行う。例えば、xset b off とすると警告音を無効にし、xset s 60 とすると1分でスクリーンセーバを起動するようになる。xset q で現在の設定を表示する。
xhost [+remotehost]
リモートマシンのXアプリケーションを操作したい場合に、そのホストによるコネクションを許可する。+remotehost を省略した場合は、現在コネクションを許可したホストのリストを表示する。単に + を指定した場合は、全てのホストのコネクションを許可する(セキュリティ上好ましくないが)。Xアプリケーションの画面をリモートホストに出力したい場合は、環境変数 DISPLAY の値を remotehost:servernumber.displaynumber の形式で設定して出力先を指定しておく。通常は servernumber と displaynumber はともに 0 でよく、export DISPLAY=jsscw020:0.0 などとすればよい( -display jsscw020:0.0 のようにして起動時のオプションで設定できるコマンドもある)。
Xconfigurator
XF86Config の設定を行う。ビデオカードは検出され、モニタの型番や解像度などは自分で入力する。
XF86Setup
XF86Config の設定を行う。ビデオカードとモニタの型番や解像度の他、キーボードやマウスの設定も手動で行う。
xvidtune
画面表示の微調整を行う。
xmodmap [-e] [-pk] [file]
X上でのキーボードマッピングを設定する。file を指定した場合はそれに書いてある設定を実行する。
-e expression: 一行の設定を実行
-pk : 現在のキーマップを出力
xev
マウスやキー操作などの、Xサーバから受け取ったイベントの内容を表示する。
xeyes
カーソルの位置を目で追って教えてくれる。
xclock
アナログ時計を表示する。
xlock [options]
スクリーンセーバーを起動し、画面をロックする。ロックを解除する時は、ユーザのパスワードを入力することが必要となる。
-nolock : パスワードによるロックをしない
-inwindow : 画面をロックせず、新しいウィンドウの中にグラフィックを表示する
-inroot : 画面をロックせず、バックグラウンドの中にグラフィックを表示する
-mode name : 表示するグラフィックを worm 等の名前で指定
xload [options]
システム平均負荷をヒストグラムにして、定期的に表示する。
-update sec : 画面を更新するまでの期間を秒数で指定
xbiff
指定ファイルの大きさが増えると報告する。デフォルトはメールのスプールを監視して着信を報告。
-file file : 監視するファイルを指定
-update seconds : チェックするタイミング。デフォルトは 30
gv [file ...]
PostScriptやPDFのファイルを閲覧する。file は読みこむファイルを指定する。
tgif [file ...]
EPSやPostScript等のベクター画像を編集する。file は読みこむファイルを指定する。
gimp [file ...]
PNMやPNGやJPEGやGIF等のラスター画像を編集する。file は読みこむファイルを指定する。
xv [file ...]
様々な形式の画像ファイルを閲覧する。file は読みこむファイルを指定。xview や ee も有名。
xanim [file ...]
動画を再生する。file は読みこむファイルを指定する。
xmms [file ...]
MP3ファイルを再生する。file は読みこむファイルを指定する。
netscape [options] [url]
ビジュアル系WWWブラウザ。url を省略すると、ホームページを読み込む。
-no-about-splash : ライセンスページの表示を省略

Xで使用するフォントは /usr/lib/X11/fonts の下に幾つかに分類されて格納される。各フォントには -alias-fixed-medium-r-normal--12-120-75-75-c-120-jisx0208.1983-0 のようなフォント名が付けられる。- で区切られた各々の要素にはワイルドカード * を用いることができるが、それによって該当するフォント名が複数あっても適当に選択されるので問題はない。例えば、等幅で、太字でなく、斜体でなく、通常の幅の、サイズ16ピクセルの日本語フォントを指定する場合は、-*-fixed-medium-r-normal--16-*-*-*-*-*-jisx0208.1983-0 とする。論理名と実際のフォントファイルの対応関係は fonts.dir というファイルに記述される。また、fonts.alias というファイルで別名を付けることもできる。

xlsfonts [-fn]
使用できるフォント名の一覧を出力する。
-fn pattern : パターンに該当するもののみ表示
xfd -fn pattern
フォントの字体を表示する。
xfontsel
字体を確認しながらフォント名を絞り込む。

正規表現

「 banana 」のような特定の文字列だけでなく、「 b で始まる6文字の単語」のように、特定のパターンを持つ文字列の集合を表現する手段として、正規表現が定められている。

表現意味表現例マッチする例
通常の文字文字そのものa apple 、boat
[ と ] の間その文字のどれか[abc] apple 、boat
[^ と ] の間その文字以外の文字[^abc] apple 、boat
[ と ] の間で、- の両端その範囲のどれか[a-e] appleboat
[^ と ] の間で、- の両端その範囲以外のどれか[^a-e] apple 、boat
^行頭^e easy come easy go
$行末e$ I'm alive
.任意の1文字.he the 、cashe
*直前の文字の0個以上の繰り返しpo*l plpolpoooool
\特殊文字の無効化\* 5*3 、*tako
banana で始まる行を抜き出す
grep '^banana' hoge.txt
Michael か michael を含む行を抜き出す
grep '[Mm]icael' hoge.txt
空行以外を抜き出す
grep -v '^$' hoge.txt
1個以上の数字とハイフンからなり、先頭には空白があってもよい行を抜き出す
grep '^ *[0-9\-][0-9\-]*$' hoge.txt
HTMLファイルからタグを取り除く
sed 's/<[^>]*>//g' hoge.html

Viエディタ

vi [-eR] [file ...]
エディタを起動する。file が指定されていると、その名前のファイルを読み込む。
-e : ラインエディットモードで起動。ex として起動しても同じ
-R : リードオンリーモードで起動。view として起動しても同じ

vi は /bin/vi としてほぼ全てのUNIXシステムに組み込まれているスクリーンエディタである。設定ファイル等は vi で編集することが望ましいらしい。vi はコマンドモードと挿入モードがあり、それらを切り替えて作業する。挿入モードでは、打ち込んだキーがそのままテキストに反映される。打ち間違えたときは Backspace を押せばよい。コマンドモードはカーソルの移動やモードの切替えなどを行うモードであり、以下のコマンドを用いる。なお、挿入モードからコマンドモードに戻る時は ESC を押せばよい。カーソルの移動は方向キーを使ってもよい。

lカーソルを右に移動
hカーソルを左に移動
kカーソルを上に移動
jカーソルを下に移動
0カーソルを行頭に移動
$カーソルを行末に移動
[Control] fカーソルを次のページに移動
[Control] bカーソルを前のページに移動
iカーソル位置を起点として挿入モードに移行
aカーソル位置の直後を起点として挿入モードに移行
oカーソル位置の行の次に空行を挿入し、その行頭を起点として挿入モードに移行
xカーソル位置の文字を削除。3x のように数字を前につけると、その文字数を削除
Jカーソル位置の行と次の行を連結
ddカーソル位置の行をカット。3dd のように数字を前につけると、その行数を削除
yyカーソル位置の行をコピー
pカーソル位置にペースト
cwカーソル位置から単語末までを消して、挿入モードに移行
mxカーソル位置にマークを付ける
y`xマークからカーソル位置までをコピー
d`xマークからカーソル位置までをカット
p直前にコピーまたはカットした領域をカーソル位置にペースト
/patternカーソル位置から前向きに文字列検索
?patternカーソル位置から後向きに文字列検索
n直前に行った検索を繰り返す
ZZファイルに保存して終了。ファイル名が指定されていない場合は不可
u直前の操作を取り消し
.直前の操作を繰り返し
[ESC]コマンドの入力を取り消し
:w filenameファイルに保存。ファイル名を指定されている場合は filename を省略してもよい
:w! filenameファイルに強制保存。同名のファイルがあっても上書きする
:q終了。保存終了する際は :wq か :wq! を使う
:q!強制終了。ファイルに保存していない場合は破棄
:1,$ s/foo/bar/g1行目から最後の行までで、パターン foo をパターン bar に置換
:set number画面左端に行番号を表示する
:sh一時的にシェルに戻る

Emacsエディタ

emacs [options] [file ...]
エディタを起動する。file が指定されていると、その名前のファイルを読み込む。
-fg color : 文字色を指定。色は "#c5c5c5" のように16進数で表現
-bg color : 背景色を指定
-cr color : カーソルの色を指定
-ms color : マウスポインタの色を指定
-g size : ウィンドウのサイズを指定。120x40 のように桁数で指定する
-f function : 起動時に実行するLisp関数を指定
-nw : Xを使わずに端末上で実行
-q : 初期設定ファイルを読み込まない

高機能エディタEmacsはとても使いやすい。キーボードの適当なキーを押すと、カーソルのある位置に対応する英数字や記号が挿入される。改行はReturnキー、空白はSpaceキー、タブはTabキー、文字の削除はBackSpaceかDeleteキーを用いる。カーソルの移動は以下で後述するキーバインドか、カーソルキーを用いて行う。

バッファとは、メモリ上に一時的に書き込まれた一連の文字列のことであり、カーソルは操作対象がバッファ中のどの位置にあるかを指示している。すなわち、文字を入力する操作は、バッファ中のカーソルが指示する位置にその文字を挿入するということである。データのセーブはバッファをファイルに書き込むことによって、ロードはファイル中の文字列をコピーした新たなバッファを作成することによってなされる。複数のファイルを同時に編集したいときは、複数のバッファを並行して使用することもできる。

Emacsの画面の大部分はバッファの内容を表示する領域である。その下の反転表示部(モードライン)はバッファの情報を示し、さらに下の部分(エコー領域)はEmacsとの対話入力を行うためのミニバッファを表示する。

Controlキーを押しながら別のキーを押したり( C-key と表記)、Metaキー(Escapeキー)を押してから別のキーを押すことによって( M-key と表記)、カーソルの移動やカット&ペーストや、ファイルの保存などの編集機能を行う。Emacsのほとんどの編集機能はEmacs-Lispの関数を実行することによってなされるが、そういった関数呼び出しと関連づけられたキー入力をキーバインドという。なお、C-h(BackSpace)は設定によってはヘルプの場合もある。

C-fカーソルを次の文字に移動
C-bカーソルを前の文字に移動
C-nカーソルを次の行に移動
C-fカーソルを前の行に移動
C-aカーソルを行の先頭に移動
C-eカーソルを行の末尾に移動
M-fカーソルを次の単語に移動
M-bカーソルを前の単語に移動
C-vカーソルを次の画面に移動
M-vカーソルを前の画面に移動
M-<カーソルをバッファの先頭に移動
M->カーソルをバッファの末尾に移動
C-hカーソルの直前の文字を削除
C-dカーソル位置の文字を削除
C-kカーソル位置から行末までの文字列をカット
C-l画面を再描画し、カーソルの位置を画面中央にする
C-s前向き文字列検索(インクリメンタルサーチ)
C-r後向き文字列検索(インクリメンタルサーチ)
C-q次に入力した制御文字をエスケープする

カット/コピーは、開始位置にマークをセットしてから、終了位置でキーバインドを入力することによって行う。C-k で削除した文字列もクリップボードに書き込まれるため、ペーストすることができる。C-k を連続して行った場合は、一連の文字列はクリップボードに連結して追加される。なお、マークした位置からカーソル位置までの領域をリージョンという。また、M-< や M-> は移動と同時に元の位置がマークされる。

C-@カーソル位置にマークをセット。C-Space でもよい
C-wマークからカーソルの直前までの文字列をカット
M-wマークからカーソルの直前までの文字列をコピー
C-yカーソル位置にクリップボードの文字列をペースト

C-x を押してエコー領域との対話モードにしてから別のキーを押すキーバインドもある。また、Controlキーを押しながら任意の数字を入力してから、別の関数呼び出しをすると、その関数が数字(部引数)の回数だけ実行される。C-u を押してからエコー領域に部引数を入力する方法もある。なお、エコー領域との対話中に操作を途中で止めたい場合は、C-g を押せばよい。対話中にファイル名を入力する際には、TabキーやSpaceキーでコンプリションできる。

C-x C-sバッファをファイルにセーブ(上書き保存)
C-x C-wバッファをファイルにセーブ(新規保存)
C-x s編集中のバッファを全てセーブ
C-x C-f新しいバッファを作って、ファイルの内容をロード
C-x C-cEmacsを終了(バッファをセーブするか確認)
C-x C-xカーソルをマークの位置に移動
C-x u直前の操作を取り消す。C-/ でも同じ
C-x bアクティブバッファの切替え
C-x kアクティブバッファの破棄
C-x C-b編集中のバッファの一覧を表示
C-x 2ウィンドウを横に二分割する
C-x 3ウィンドウを縦に二分割する
C-x o分割された別のウィンドウにカーソルを移動
C-x 1分割されたウィンドウをカーソルのある方に統一
C-x 0分割されたウィンドウをカーソルのない方に統一
C-x ^分割されたウィンドウのカーソルのある方を縦に広げる
C-x }分割されたウィンドウのカーソルのある方を横に広げる

キーバインド以外にも、M-x を押してからその名前をエコー領域に入力することでLisp関数を呼び出すことができる。Emacs-List関数はこの他にも膨大に用意されている。関数名の入力もコンプリション可能で、途中でやめる時は C-g を押せばよい。検索置換の文字列に改行を含めたい場合は、入力時に C-n を押せばよい。

M-x replace-stringカーソルの位置からファイルの末尾までの該当する文字列を任意のものに一括して置換
M-x query-replaceカーソルの位置からファイルの末尾までの該当する文字列を任意のものに対話的に置換
M-x goto-line指定した番号の行にカーソルを移動
M-x make-frame別のウィンドウを作成
M-x xxx-mode編集モードを変更。xxxには、c、html、shell-script、java、text、viper 等を用いる
M-x spell-bufferバッファ全体にスペルチェックをかける。spell-region や spell-word もある
M-x recover-fileバックアップファイルからバッファを復元
M-x set-file-coding-system保存するファイルの文字コードを変換。C-x Return f や C-x C-k f で指定するバージョンもある
M-x upcase-regionリージョン内の小文字を全て大文字に変える
M-x downcase-regionリージョン内の大文字を全て小文字に変える
M-x capitalize-regionリージョン内の単語の先頭の文字を全て大文字に変える
M-x toggle-read-onlyバッファの書き込み許可をスイッチ
M-x print-bufferバッファを印刷。print-regionもある
M-x shellEmacs上で bash を起動。直前のコマンドは M-p で出せる
M-x manEmacs上で man を起動
M-x global-set-key新しくキーバインドを定義する
M-x help-with-tutorialEmacsのチュートリアルを表示
M-x aproposキーワードでヘルプを検索
M-x load-fileLispで書かれたファイルを読み込んで実行

テキストの詰め込み(改行による折り返し)は、任意の詰め込み桁数と接頭辞を設定してから行う。

M-x set-fill-region部引数で指定した桁に詰め込み行を指定。デフォルトは70桁
M-x set-fill-prefix行頭からカーソルの位置までの文字列を詰め込み接頭辞に設定
M-x fill-paragraphカーソルのある段落を詰め込む
M-x fill-regionリージョン内の全ての段落を詰め込む
M-x auto-fill-mode改行する度に詰め込みを行うモードのスイッチ

よく行う一連の入力や操作をマクロとして登録しておくと、そのマクロを呼び出すだけで実行できるようになる。マクロの登録を開始したら、その操作を実際に行って、それから登録を終了すればよい。

C-x (マクロの登録を開始
C-x )マクロの登録を終了
C-x e直前に登録したマクロを実行
M-x name-last-kbd-macro直前に登録したマクロに名前を付ける
M-x apply-macro-to-region-linesリージョン内の各行でマクロを実行

何度も入力する文字列は、レジスタに登録しておいて、それをバッファに挿入するようにすると便利である。レジスタの登録時には、一文字のレジスタ名をつけ、挿入時にはその名前でレジスタを選択する。

C-x r sリージョンをレジスタに登録
C-x r iカーソルの位置にレジスタの内容を挿入

その他にも、以下の機能が使えると便利である。コンパイル結果のフレームでエラーメッセージにカーソルを合わせて Return を入力すると、そのエラーの対象行に移動する。

C-tカーソルの前後の文字を入れ換える
M-tカーソルの前後の単語を入れ換える
C-x C-tカーソルの前後の行を入れ換える
M-x untabifyリージョン内のタブを同じ幅のスペースに置換
M-x tabifyリージョン内のスペースを同じ幅のタブにできるだけ置換
M-x uカーソルのある単語を大文字に変換
M-x lカーソルのある単語を小文字に変換
M-;使用言語に応じたコメント区を行末に挿入
M-\使用言語に応じてリージョンをインデントする
M-C-v二つに分けた別のウィンドウをスクロール
M-.etags のタグファイルを使って語句の定義部に移動
M-x eval-regionリージョン内のLispコマンドを実行
M-x compileコンパイルコマンド(make)を実行
M-x recompile直前のコンパイルコマンドを再実行
M-x doctorサイコセラピストと対話する

モードラインには、以下のような意味がある。

-[ あ ]E.:--**-Emacs: example.html   (HTML)--L21--Top-------------------------
 | 1  |2 | 3   | 4  | 5              | 6    | 7  | 8 |
  1. 入力モード = 非表示:直接入力モード。[ あ ]:かな入力モード。[漢字]:漢字変換モード
  2. 文字コード = E.:EUC。J.:JIS。S.:シフトJIS
  3. バッファの変更状態 = -----:未変更状態。--**-:変更状態。--%%-:書き込み不可
  4. プログラム名 = Emacs、Mule、NEmacsなどの区分や、起動しているモジュールの種類
  5. バッファ名 = バッファと関連づけられたファイル名。*scratch* の場合は関連づけられていないバッファ
  6. 編集モード名 = 自動インデントの解析モード。(Fundamental):解析なし。C、HTML、Javaなどなど
  7. カーソル位置の行番号
  8. 表示画面のバッファ上での位置 = All:全て表示。Top:最上部。Bot:最下部。n%:パーセンテージ

Emacs上でかな漢字変換システム「かんな」を使って日本語入力をする場合、M-x canna でそれを起動する(かんなサーバが起動していないなら /usr/sbin/cannaserver を立ち上げておく)。起動したら、C-o で「かな入力」モードに切り替わるので、ローマ字入力によって平仮名を表示する。そこでSpaceを押すと「漢字変換」モードに切り替わるので、以下のキーバインドを用いて漢字を選択決定する。なお、全角のスペースは「@@」と打つと入力できる。C-o が kinput2 の入力切替えになってしまう場合は、~/.Xdefaults に emacs*xnlLanguage: C という行を追加するとよい。

Space次の変換候補を出す
Return変換候補を確定する
C-f変換対象の文節を右に進める。カーソルキーの右でも可
C-b変換対象の文節を左に戻す。カーソルキーの左でも可
C-o文節を1文字伸ばす
C-i文節を1文字縮める
C-n平仮名、片仮名、半角片仮名、全角英字、半角英字に切替える。カーソルキーの下でも可
C-p上記と逆の順序で切替える。カーソルキーの上でも可
C-g変換前の状態に戻す

単語を辞書登録するときは、M-x canna-touroku を実行するか、登録したい単語をリージョンにして M-x canna-touroku-region を呼び出せばよい。通常の方法で変換できない漢字は M-x canna-bushu-mode で部首検索すればよい。

Emacsが起動した時には、ホームディレクトリの .emacs というファイルに書かれたLispプログラムが実行されて、Emacsの初期設定が行われる。デフォルトの設定で大体使えるが、個人的には以下の設定が気に入っている(かんな/emacsに依存)。フォントの指定はシステムによって異なるかもしれない( /usr/share/emacs/20.5/lisp/international/fontset.el あたりで指定)。なお、.emacs の文字コードは iso-2022-jp にしておくべきである。

;; Key Binding
(global-unset-key "\C-h") (global-set-key "\C-h" 'backward-delete-char)
(global-unset-key "\C-\\") (global-set-key "\C-\\" 'scroll-other-window-down)
(global-unset-key "\C-^") (global-set-key "\C-^" 'scroll-other-window)
(global-unset-key "\C-z") (global-set-key "\C-z" 'call-last-kbd-macro)

;; Japanese Setting
(set-language-environment "Japanese")
(set-keyboard-coding-system 'euc-jp-unix)
(set-terminal-coding-system 'euc-jp-unix)
(set-buffer-file-coding-system 'euc-jp-unix)
(set-default-coding-systems 'euc-jp-unix)
(prefer-coding-system 'euc-jp-unix)

;; Miscellaneous Setting
(menu-bar-mode nil)
(scroll-bar-mode nil)
(setq initial-scratch-message nil)
(setq inhibit-startup-message t)
(setq next-line-add-newlines nil)

;; Canna Setting
(load-library "canna")
(canna)
(define-key canna-mode-map [?\177] [?\C-h])
(if (eq window-system 'x) (progn
  (setq canna-use-color t)
  (setq canna-with-fences nil)
  (setq canna-underline t)))

;; Frame Setting on X Window
(if (eq window-system 'x) (progn
  (setq default-frame-alist '(
    (font . "-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard")
    (foreground-color . "#ddeeff") (background-color . "#002222")
    (cursor-color . "#99ccff") (mouse-color . "#ddeeff")
    (width . 100) (height . 50)
    (top . 16) (left . 16)))
  (modify-face 'modeline "#112222" "#aabbcc" nil nil nil nil)
  (load-library "font-lock")
  (global-font-lock-mode t)
  (set-face-foreground font-lock-builtin-face "#9900ff")
  (set-face-foreground font-lock-comment-face "#bb1100")
  (set-face-foreground font-lock-constant-face "#aabbcc")
  (set-face-foreground font-lock-function-name-face "#88ddbb")
  (set-face-foreground font-lock-keyword-face "#4488ee")
  (set-face-foreground font-lock-type-face "#88bbff")
  (set-face-foreground font-lock-string-face "#8899aa")
  (set-face-foreground font-lock-variable-name-face "#88ddbb")
  (set-face-foreground font-lock-warning-face "#0077ff")))

;; Setting for Editing
(add-hook 'c-mode-common-hook '(lambda ()
  (setq indent-tabs-mode nil)
  (setq c-basic-offset 2)))
(setq auto-mode-alist (append auto-mode-alist (list '("\\.js$" . c-mode))))
(setq auto-mode-alist (append auto-mode-alist (list '("\\.tex$" . latex-mode))))
(setq compile-command "make")
(setq tags-file-name "TAGS")

C言語プログラミング

基本的には、.c という拡張子でソースファイルを作成して、gcc(または cc)でファイル名を指定してコンパイルすればよい。すると a.out という実行可能ファイルができるので、それを実行すると結果を確認できる。gcc はプリプロセッサ(cpp)、コンパイラ(cc1)、アセンブラ(as)、リンカ(ld)を順番に呼び出すコンパイラドライバである。C言語デバッガ gdb を用いるには、gcc で -g オプションをつけてプログラムをコンパイルする。

ソースファイルは .c 、ヘッダファイルは .h 、プリプロセス済みソースファイルは .i 、アセンブラソースファイルは .s 、オブジェクトファイルは .o 、オブジェクトファイルをまとめたアーカイブファイルは .a 、ダイナミックリンクされる共有オブジェクトファイルは .so という拡張子のファイル名にしておく。なお、C++言語のソースファイルは .cc 拡張子にして、g++ コマンドでコンパイルする。

C言語のプログラミングに関連するコマンドは以下である。

gcc [-ILEScOgo] file ... [-l]
C言語コンパイルのフェーズ制御プログラム。file は指定された順番でリンカに渡される。
-Ipath : インクルードファイルの検索パスを追加する
-Lpath : ライブラリの検索パスを追加する
-E : コンパイラを実行せずに、プリプロセス後のソースを出力して終る
-S : アセンブラを実行せずに、アセンブラソースファイルを生成して終る
-c : リンカを実行せずに、オブジェクトファイルを生成して終る
-O1 : 最適化を実行する。デフォルトでは実行しない。-O2 や -O3 だとさらに強力
-g : デバッガ用のシンボルテーブルを付加。-O オプションと同時には使えない
-o file : 生成するファイル名を指定する
-llibname : リンクするライブラリを指定する。例えば、-lm とすると、libm.a(または libm.so)をリンクする。なお、標準ライブラリ libc.a(または libc.so)を指定する -lc はデフォルトで指定される。このオプションは必ずファイル名より後に書かなければならない
-static : ダイナミックリンクでなく、スタティックリンクを行う
-shared : 実行ファイルではなく、共有オブジェクトファイルを作成
-Dmacro[=value] : プリプロセッサのマクロを追加定義
-Umacro : プリプロセッサのマクロを無効化
-include file : 通常のファイルを処理する前に、指定のファイルを取り込む
-MM : システムライブラリ以外の依存ヘッダファイルをMakefileの形式で標準出力する
-Wall : 厳密な警告を出す
-ansi : ANSI C準拠のプログラムとしてコンパイルする。これを付けると ISO C非互換のライブラリの使用に警告が出るが、それが嫌なら -D_GNU_SOURCE も付けるとよい
-pedantic : ANSI C非互換の機能を警告する
-v : コンパイルの各段階の実行コマンドを表示
-pipe : コンパイルの各段階間のデータ受渡しにパイプを使用する
-pg : 生成する実行ファイルが、プロファイラ gprof が利用するファイル gmon.out を生成するようにする
gdb [program]
C言語のソースレベルデバッガ。program を指定した場合は、起動時にそのプログラムを読み込む。gdb を起動するとプロンプトが出るので、そこで以下のサブコマンドを使ってデバッグを行う。対象プログラムを実行すると、予め設定したブレークポイントか、シグナルを受け取った時点でプロンプトに戻る。
file program : デバッグの対象となるプログラムを読み込む
list [line] : 現在位置もしくは指定行の周辺のソースコードを表示
fo [regex] : 現在位置から前方検索してソースコードを表示
rev [regex] : 現在位置から後方検索してソースコードを表示
break [line|function] : 指定行か関数にブレークポイントを設定
clear [line|function] : 指定行か関数のブレークポイントを解除
delete [number] : 指定番号か全てのブレークポイントを解除
run [arguments]: 読み込んだプログラムの実行を開始。arguments はシェルから渡すコマンドライン引数。リダイレクションも使える
continue : 停止したプログラムの実行を再開
next : 停止したプログラムで、現在の行を実行し、(現在の関数の)次の行で止まる
step : 停止したプログラムで、現在の行を実行し、(関数呼び出しがあれば呼び出し先の)次の行で止まる
bt : 関数呼び出しの経路を表示
print [expression] : 式や変数の値を表示
display [expression] : 式や変数の値を、プログラムが停止する度に自動表示するように設定
undisplay [number] : 指定番号か全ての自動表示の設定を解除
commands [number] : 指定番号か現在のプレークポイントに来る度に自動的に実行されるサブコマンドを設定
condition number [expression] : 指定番号のブレークポイントを、expression が真の場合のみ停止するようにする。expression を省略すると条件を解除
ignore number count : 指定番号のブレークポイントを、指定回数だけ無視するようにする
info [subcommand] : ブレークポイントや自動表示等、各種設定の状態を表示
disable [display] [number] : 指定番号か全てのブレークポイントもしくは自動表示を一時的に無効化する
enable [display] [number] : disable の効果を打ち消す
set arguments : 式を評価する。主に変数の値を設定するのに用い、例えば set variable n = n + 1 などとする
quit : gdb を終了
ar subcommands [archive] [file ...]
オブジェクトファイルからライブラリ(arアーカイブ)を作成する。とりあえず、以下の使い方をする。
ar rcsv archive objectfile ... : オブジェクトファイルから指定した名前のアーカイブを作る
ar t archive : アーカイブに含まれるオブジェクトファイルのリストを出力
ar xv archive : アーカイブに含まれるオブジェクトファイルを全て取り出す
ranlib file ...
作成したライブラリのリンクテーブルを作成する。ar で s コマンドを実行するのと同じである。
nm file ...
オブジェクトファイルやライブラリのシンボルテーブル情報を出力する。
-s : アーカイブのインデックスも出力
-g : 外部シンボルのみを出力
-l : デバッグ情報(対応するファイル名と行番号の出力)
ldd file ...
プログラムやライブラリが依存する共有オブジェクトを表示する。
ldconfig
実行時リンクの設定。/etc/ld.so.conf に書いてある共有オブジェクトのサーチパスを反映させる。
size file ...
オブジェクトファイルの各セグメント(セクション)のサイズを表示する。
strip program ...
デバッガ用シンボルテーブルをプログラムから除去する。
indent [options] file ...
C言語のソースファイルを整形して見やすくする。デフォルトでは、file そのものを書き換える。
-gnu : GNU形式に整形。デフォルトで指定
-kr : K&R形式に整形
-inumber : インデントの単位空白数を number 個に設定
-lnumber : 各行の最大文字数を number 文字に設定
-br : if の後のブレースの前で改行しない
-ce : else の後のブレースの前で改行しない
-o file : 生成するファイル名を指定する
-st : 変換結果を標準出力する
cdecl [subcommand]
C言語の宣言文と英語表現を相互変換する。cdecl explain "declaration" とすると、その宣言文を英語表現に変換し、cdecl declare "english" とすると、その英語表現を宣言文に変換する。subcommand を省くと対話モードになる。
gprof objfile
コールグラフのプロファイルを表示する。コールグラフは、gcc の -pg オプションをつけて生成したコマンドを実行すると生成される。objfile は、実行したコマンドのパスを指定する。
etags [-o srcfile] files ...
ソースコードから、タグ(識別子)とその定義部のインデックスファイルを TAGS という名前で生成する。これは emacs の find-tags コマンド(M-.)で利用できる。
-o filename : 出力先を指定のファイル名に変更

大規模なプログラムを作る場合は、ソースファイルの更新時刻を読んで、必要なファイルのみを再コンパイルするユーティリティ make を用いる。make はカレントディレクトリの Makefile または makefile という名前の設定ファイルを読み込んで処理を行う。Makefile は以下のように記述する。

CC = gcc
CFLAGS = -O2 -ansi -Wall

hello : main.o sub.o
        $(CC) $(CFLAGS) -o $@ main.o sub.o

main.o sub.o : common.h

冒頭の2行はマクロの指定である。4行目は、ターゲット hello を達成するには、ターゲット main.o と sub.o を達成した上で、5行目に指定するコマンドラインを実行せよと指定している。このコマンド指定行は複数行連続できるが、行頭にタブを置かねばならない。コマンド行によって実行されたコマンドが 0 以外の値を返した場合は、その時点で処理が中断されるが、タブの直後に - を置いた場合は実行を中断しない。$(CC) と $(CFLAGS) は冒頭で定義したマクロの参照で、$@ はターゲット名を値に持つマクロの参照であり、各々の持つ値に展開される。7行目は、main.o と greeting.o は common.h を前提としていることを示す。common.h は既にファイルとして存在するので、コマンド指定は必要ない。なお、main.o は main.c から、greeting.o は greeting.c から作られることは自明(暗黙のサフィックスルール)なので、それについて記述する必要はない。CC と CFLAGS は、この自明の処理を行う際に適応されるコンパイラとその引数をも指示する。なお、サフィックスルールを明示的に指定する場合は、Makefile の冒頭に以下のように記述する。

.SUFFIXES : .java .class

JAVAC = javac

.java.class :
        $(JAVAC) $<

1行目は .java と .class が拡張子であることを指示する。3行目はマクロの指定である。5行目は .class を拡張子に持つファイルは、同名で拡張子を .java に変えた名前のファイルに依存することを指示し、6行目に指定するコマンドラインで処理して作成すべきことを指示している。6行目もコマンド指定行であるから、タブを先頭に置かなければならない。$< はターゲットが依存しているファイルのひとつを値に持つマクロだが、この場合は暗黙的に .java を拡張子に持つファイル名をその値とする。

make [target ...]
Makefile を読んで、target を達成する。target を省略すると、Makefile 中の最初のターゲットを達成する。
-f file : Makefile の代わりに指定したファイルを使用
-i : 処理コマンドがエラーコードを返しても処理を中断しない
-k : ターゲットの構築に失敗しても、その他の依存関係の処理を続ける
-n : 実行するコマンドの表示のみを行って、実際には処理をしない
-s : make のメッセージ出力を抑制する
install [-ogmD] source ... dest
ファイルをコピーすると同時に、パーミッションを実行可能にする。source はコピー元、dest は作成するコピーのパスを指定する。コピー先がディレクトリ名の場合は、そのディレクトリの中に同名のファイルを作成する。
-o user : 同時にファイルの所有者を変更
-g group : 同時にファイルのグループを変更
-m mode : 同時にファイルのパーミッションを変更
-D : コピー先のディレクトリがない場合にそれを作成

CVS

CVSは次々と更新していく文書やプログラムソースを管理するシステムである。各リビジョンの差分を保存していくので、過去のリビジョンに戻ったり、更新履歴を確認したり、パッチを作成するのが容易になる。マージ機能によって、複数の人間が同じファイルやモジュールを同時編集することを支援する。

CVSを使う前の準備として、export CVSROOT=$HOME/.cvs などとして、環境変数 CVSROOT にリポジトリを格納するディレクトリを設定しておく( .bashrc に書いておく)。その上で、cvs init を行ってリポジトリを作成する。リポジトリとは、各ファイルやその集合であるモジュールを管理するデータベースである。複数人による共同作業は、特定のリポジトリを共有することによって行う。リモートのCVSサーバに接続する時は、環境変数 CVSROOTの値を :pserver:username@servername:projectpath という形式で指定する(最初に使用する前に、cvs login を実行すること)。

バージョン管理を始めるには、CVSで管理したいモジュールを特定のディレクトリ以下に作成し、そのディレクトリをカレントディレクトリにして、cvs import を行ってリポジトリに登録しておく。その上で、更新作業を始めるには、cvs checkout を行ってリポジトリから作業ファイルをコピーする。次に作業ファイルを編集し、差分を cvs commit によってリポジトリに還元(コミット)する。なお、自分が更新をコミットする前に、別の人間がコミットしてリポジトリが修正されている場合、cvs update によって作業ディレクトリがリポジトリの更新を取り込んでからコミットしなければならない(マージ)。最後に、作業が終ったら、cvs release によって作業ファイルを片付ける。

-r オプションを付けた cvs checkout や cvs update によって過去のリビジョンを取り出した場合、作業ファイルには最新でないことを意味するスティッキー属性が付く。スティッキーの作業ファイルはコミットできないが、-A オプションを付けて再びそれらを実行してマージしておけば可能になる。

CVSの主なサブコマンドは以下である。

cvs init
リポジトリを作成する。
cvs import [-m] repository vendertag releasetag
カレントディレクトリをモジュールとして、ファイル(サブディレクトリの中身も再帰的に扱う)をリポジトリに登録する。repository は作成するモジュールの名前、vendertag は作成した人やグループの名前、releasetag は後で参照するためのタグ( start などとすればいよい)を取る。なお、最初のリビジョンは 1.1.1.1 になる。
-m msg : ログメッセージを指定する。デフォルトでは、ログを書くためにエディタが起動される
cvs checkout [-d] module ...
リポジトリから作業ファイルを取り出して、ディレクトリ内に保存する。またはリポジトリの更新を作業ファイルにマージして最新の状態にする。
-d directory : 作成するディレクトリの名前を指定。デフォルトはモジュール名を使う
-r tag : 最新のバージョンでなく、指定したタグかリビジョン番号のモジュールを取り出す
-A : スティッキー属性を解除する
出力におけるマークは、以下の意味を持つ。
U : 更新していなかった作業ファイルがリポジトリに合わせて更新された
A : 存在していなかった作業ファイルがリポジトリに合わせて追加された
R : 存在していた作業ファイルがリポジトリに合わせて削除された
M : 既に更新していた作業ファイルがリポジトリに合わせてマージされた
C : 作業ファイルとリポジトリの修正箇所の衝突によりマージに失敗した
cvs update [-C] [file ...]
リポジトリの更新を作業ファイルにマージして最新の状態にする。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。出力の意味は cvs checkout のそれと同じ。
-C : 作業ファイルの更新を破棄して、完全にリポジトリと一致させる
-d : サブディレクトリの作成を許可する
-r tag : 最新のバージョンでなく、指定したタグかリビジョン番号のモジュールを取り出す
-A : スティッキー属性を解除する
cvs commit [-m] [file ...]
作業による差分をリポジトリに還元する。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。
-m msg : ログメッセージを指定する。デフォルトでは、ログを書くためにエディタが起動される
cvs release [-d] [directory ...]
作業終了をリポジトリに記録する。単に rm 等で消しても構わないのだが、記録を残して消した方がよい。差分を commit していない場合に警告してくれる利点もある。
-d : 同時に作業ファイルを消す
cvs add [-m] file ...
新しいファイルをモジュールに加えることを宣言する。リポジトリへの反映は cvs commit した時になされる。サブディレクトリを追加する際は、サブディレクトリ自身とその中身の各ファイルを全て指定しなければならない。
-m msg : ログメッセージを指定する。デフォルトでは、ログを書くためにエディタが起動される
-kb : バイナリファイルを追加する
cvs remove [-Rf] file ...
既存のファイルをモジュールから削除することを宣言する。作業ファイルをまず削除してから行わなければならない。リポジトリへの反映は cvs commit した時になされる。
-R : サブディレクトリを再帰的に処理する
-f : 同時に作業ファイルを消す
cvs status [file ...]
作業ファイルの状態を出力する。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。
cvs diff [file ...]
作業ファイルとリポジトリの差分を出力する。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。
cvs log [file ...]
作業ファイルのログを出力する。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。
cvs annotate [file ...]
作業ファイルの各行を、その更新情報とともに出力する。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。
cvs tag tagname [file ...]
作業ファイルにタグを付ける。file を省略した場合、カレントディレクトリ以下にあるリポジトリに登録された全てのファイルを対象とする。

Apache

Apacheは高機能なWWWサーバである。普通にLinuxディストリビューションをインストールするとバイナリでApacheも入れることができるが、設定を簡単にするためにソースから入れた方がよい。ソースからインストールすると、/usr/local/apache 以下にバイナリと各種設定ファイルが入れられる。主な設定ファイルは /usr/local/apache/conf/httpd.conf である。普通に使いたいだけなら、UserとGroupとListenを設定するだけでよいが、各ユーザが設定をオーバーライドできるようにするには、<Directory /home/*/public_html> ディレクティブのコメントを外して、その中で AllowOverride All を用いる。また、サーバのトップページは DocumentRoot 命令の後にディレクトリのパスを書いて設定する。MIMEタイプの設定は /usr/local/apache/conf/mime.types で行う。Apacheを起動する際は、/usr/local/apache/bin/apachctl start (再起動は restart 、停止は stop )とすればよいが、ブート時に自動的にApacheも起動したい場合は、/etc/rc.d/rc.local の末尾に以下を書き加える。

if [ -f /usr/local/apache/bin/apachectl ]; then
  /usr/local/apache/bin/apachectl start
fi

ディレクトリのリスト表示を許可し、文字コードにEUC-JPを用い、CGIとSSIを使うならば、各ユーザのホームディレクトリか public_html 以下に .htaccess というファイルを作り、以下のように書いておく。なお、自分のディレクトリにファイルを作るCGIプログラムは chmod 6755 hoge.cgi などとして setuid と setgid を立てなければならない。

Options All

AddType "text/html; charset=EUC-JP" .html .htm
AddType "application/xml; charset=EUC-JP" .xml
AddType "text/xhtml; charset=EUC-JP" .xhtml
AddType "text/plain; charset=EUC-JP" .txt .text .c .h .tex

AddHandler "cgi-script" .cgi
AddHandler "server-parsed" .shtml

DirectoryIndex index.html index.htm index.cgi index-j.html

特定のディレクトリにアクセスするのにパスワード認証を求めたい場合は、そのディレクトリ直下に .htaccess を作って以下のように書く。AuthUserFile 命令で指定するのはパスワードファイルのパスである。パスワードファイルは、あらかじめ空のファイルを作っておいて、/usr/local/apache/bin/htpasswd を使って各ユーザ名とパスワードを追加する。例えば .htpasswd というファイルにユーザ名 foo でパスワード bar のアカウントを加えたい場合は、/usr/local/apache/bin/htpasswd -b .htpasswd foo bar とする。

AuthName "My Private Warehouse"
AuthType Basic
AuthUserFile "/home/sergeant/public_html/warehouse/.htpasswd"
require valid-user

特定の拡張子のファイルがアクセスされた際に、その拡張子にバインドされたCGIスクリプトを起動するには、.htaccess に以下のように書く。この例では、split-pdf アクションを /split-pdf.cgi の参照として定義し、さらに、拡張子が .pdf ファイルを split-pdf アクションに関連づけている。呼び出されたCGIスクリプトには、要求されたファイルの絶対パスが環境変数 PATH_TRANSLATED の値として渡される。

AddHandler cgi-script .cgi
Action split-pdf /split-pdf.cgi
AddHandler split-pdf .pdf

ディレクトリ階層

Linuxの標準的なディレクトリ階層は以下のようになる。規格としてFSSTND(The Linux Filesystem Standard)とFHS(The Filesystem Hierarchy Standard)が共存していることもあり、システム毎に異なる部分も多少ある。


私的環境設定

.bashrc に関して個人的には以下の設定が気に入っている。ほとんどの設定を .bashrc で行い、.bash_profile からも .bashrc を実行するようにしておく。

# Command search path
export PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin"
export PATH="$PATH:$HOME/local/bin"

# Dinamic linked library search path
export LD_LIBRARY_PATH="/lib:/usr/lib:/usr/local/lib:/usr/X11R6/lib"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$HOME/local/lib"

# Command prompt
export PS1='\h[\w]\$ '

# Safety-minded file utilities
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Comfortable ls
alias ls='ls -F --color=tty'
alias ll='ls -l'
alias la='ls -a'
alias lla='ls -la'

# Confortable cd
alias cd='backdir=`pwd` ; cd'
alias back='[ -n "$backdir" ] && \cd $backdir'

# Confortable less
alias less='less -if'

# Comfortable ps
alias pa='ps axuww'
alias pm='ps axuww | grep ^$USER'

# Alias to switch Japanese locale and English one
alias japanese='LANG=ja_JP.eucJP ; LC_ALL=ja_JP.eucJP ; export LANG LC_ALL #'
alias english='LANG=C ; LC_ALL=C ; export LANG LC_ALL #'

# Generic pager and editor setting
export PAGER='/usr/bin/less -i'
export EDITOR='/usr/bin/emacs -nw'

# Mounting shortcuts
alias mcd='mount /dev/cdrom #'
alias umcd='umount /mnt/cdrom #'
alias mfd='mount /dev/fd0 #'
alias umfd='umount /mnt/floppy #'

# Comfortable kterm
KTERM="\\kterm -g 100x35 +sb -lsp \$LS -fg \\#ddeeff -bg \\#001133 -cr \\#99ccff \
-fl -\\*-fixed-medium-r-normal--\$FS-\\*-\\*-\\*-\\*-\\*-iso8859-1,\
-\\*-fixed-medium-r-normal--\$FS-\\*-\\*-\\*-\\*-\\*-jisx0208.1983-0 \
-flb -\\*-fixed-bold-r-normal--\$FS-\\*-\\*-\\*-\\*-\\*-iso8859-1,\
-\\*-fixed-bold-r-normal--\$FS-\\*-\\*-\\*-\\*-\\*-jisx0208.1983-0"
alias kterm1="{ LS=1; FS=14; $KTERM; unset LS FS; } #"
alias kterm2="{ LS=2; FS=16; $KTERM; unset LS FS; } #"
alias kterm3="{ LS=2; FS=20; $KTERM; unset LS FS; } #"
alias kterm4="{ LS=3; FS=24; $KTERM; unset LS FS; } #"
unset KTERM
alias kterm='kterm2'
export TERM="vt100"

# Disposal of backup files made by emacs
alias diet='rm -f *~ \#* .*~ .\#* #'
alias nyoro="find . '(' -name '*~' -o -name '.*~' -o -name '#*' -o -name '.#*' ')' -print"
alias rmnyoro='rm -f `nyoro` #'

# Find secret files
alias dots='find . -name ".*" -print'

# Proxy setting for wget and lynx
export http_proxy='http://proxy.kamikaze.go.jp:3128/'
export ftp_proxy='http://proxy.kamikaze.go.jp:3128/'
export no_proxy='kamikaze.go.jp'

# Setting for cvs
export CVSROOT="$HOME/.cvs"
export CVSEDITOR="emacs -nw"

# For programming
alias reconf='autoconf; ./configure'
alias remake='make clean; make'
alias dmake='make clean; make debug'
alias cwd='export PATH=$PATH:`pwd`; export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`'

.bash_profile に関して個人的には以下の設定が気に入っている。

umask 022
ulimit -S -c 0
export USER=`id -un`
export LOGNAME=$USER
export MAIL="/var/spool/mail/$USER"
export HOSTNAME=`hostname`
export BASH_ENV="$HOME/.bashrc"
export INPUTRC="$HOME/.inputrc"
export HISTSIZE=100
export HISTFILE="$HOME/.bash_history"
export HISTFILESIZE=100

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

.inputrc に関して個人的には以下の設定が気に入っている。なお、ベルを鳴らしたくない場合は set bell-style none という行を加えるとよい。

# Enable 8 bit character
set convert-meta off
set meta-flag on
set input-meta on
set output-meta on

csh や tcsh を使う場合に備えて、.tcshrc もホームディレクトリに作っておくとよい。

# Command search path
setenv PATH '/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin'

# Dinamic linked library search path
setenv LD_LIBRARY_PATH '/lib:/usr/lib:/usr/local/lin:/usr/X11R6/lib'

# Command prompt
set prompt='%m[%~]%% '

# Safety-minded file utilities
alias rm 'rm -i'
alias cp 'cp -i'
alias mv 'mv -i'

# Comfortable ls
alias ls 'ls -F --color=tty'
alias ll 'ls -l'
alias la 'ls -a'
alias lla 'ls -la'

# Alias to switch Japanese locale and English one
alias japanese 'setenv LANG ja_JP.eucJP ; setenv LC_ALL ja_JP.eucJP'
alias english 'setenv LANG C ; setenv LC_ALL C'

# Generic pager and editor setting
setenv PAGER '/usr/bin/less -i'
setenv EDITOR '/usr/bin/emacs -nw'

# Other shell variables
set autolist
set dspmbyte='euc'
set filec

その他のTIPS

PPP接続

普通にLinuxをインストールすれば、PPP接続に必要なソフトも同時にインストールされるので、あとは適当なモデムを用意する。そして、ISPと契約し、その接続先電話番号と自分のアカウントとパスワードを調べておく。DNSも含めたネットワーク設定は既にしてあるものとする。

locate や find で ppp-on と ppp-on-dialer と ppp-off というファイルを検索し、それらを適当な場所(/etc/ppp/ など)にコピーする。そして、コピーした ppp-on ファイルの以下の項目を書き換える。

# 前略

TELEPHONE=075-466-2285  # The telephone number for the connection
ACCOUNT=ps999999        # The account name for logon (as in 'George Burns')
PASSWORD=abcdefgh       # The password for this account (and 'Gracie Allen')
LOCAL_IP=0.0.0.0        # Local IP address if known. Dynamic = 0.0.0.0
REMOTE_IP=0.0.0.0       # Remote IP address if desired. Normally 0.0.0.0
NETMASK=255.255.255.0   # The proper netmask if needed

# 中略

DIALER_SCRIPT=/etc/ppp/ppp-on-dialer

# 後略

PPP接続を開始するには、先程コピーしておいた ppp-on スクリプトを実行してやればよい(実行権限を与えておく)。

# /etc/ppp/ppp-on

すると、モデムが作動して、telnet や netscape などでネットワークを使用できるようになる。インターネットに接続したい場合は、そのアプリケーションごとにプロクシを指定してやればよい。接続を切るときは、同じくコピーしておいた ppp-off スクリプトを実行する。

# /etc/ppp/ppp-off

tkppxp を使う方法はもっと簡単で、設定も接続もそれのみで行える。設定は、シェルから tkppxp を起動して、メニューの「Operation」の「Quick Dialup」を開いて行う。「標準設定」ではモデムのデバイス(COM1 なら /dev/ttyS0)を選び、またISPでのログイン名とパスワードを入力する。次に「詳細設定」で「VJ圧縮」を no にする。最後に「DNS設定」でDNSのドメイン名とIPアドレスを入力する(ここで、resolv.conf を設定していない場合は、書き換えを yes にする)。あとは「保存」ボタンで設定を保存して、「閉じる」をクリックして完了。

接続する時は、保存した設定をメニューの「File」から開いて、再生ボタンを押すだけ。接続を切断する時は停止ボタンを押せばよい。