Cシェル変数マニュアル

csh・tcsh のシェル変数の簡単な説明です。sh・bash・ksh・zsh と csh・tcsh の間にはほとんど共通点はありません。よって、sh・bash・ksh・zsh をお使いの方には、このページは参考にならないでしょう。

シェル変数とは、シェルの設定を決めるためのものです。以下に説明するシェル変数を参照するのは「シェルとシェルの内部コマンドのみ」であって、それ以外のあらゆるコマンド・プログラムはシェル変数とは一切関係ありません。

一般のコマンドの設定を変更するには、環境変数を設定したり、各コマンド専用の設定ファイルを使ったりします。環境変数については 簡易版 環境変数マニュアルを参照してください。

シェル変数の設定方法は、大別して2種類あります。一つは、ある機能を有効にする場合に

% set SHELL_VARIABLE
とし、無効にする場合は
% unset SHELL_VARIABLE
とする方法です。例えば notify などがこれにあたります。もう一つは
% set SHELL_VARIABLE = CONTNET
というふうに、ファイル名やモードなどを設定する方法です。例えば prompt などはこちらの方法で設定します。この他にユーザが変更する必要のないシェル変数 (homeuid など) もあります。現在設定されているシェル変数を見るには、引数なしで set コマンドを実行してください。

シェル変数名の大文字・小文字は区別されますが、慣例としてシェル変数名には小文字を使うようになっているようです (環境変数には大文字を使います)。特別な理由がないなら小文字のみを使う方が無難でしょう。

次回のログイン時に自動的にその設定が有効となるようにしたい場合は、~/.cshrc や ~/.tcshrc に set 文を追加してください。

autolist tcsh のみ。ファイル名の補完時に候補が複数あれば表示する。

普通は複数候補があるときに TAB キーを押すと BEEP 音がなるだけだが、autolist がセットしてあると候補を表示する
% set autolist

autologout 自動ログアウトまでの時間を設定

csh・tcsh は、ログアウトし忘れたまま席を離れてしまった場合を考え、一定時間ユーザからの入力がないと、自動的にログアウトする機能を持っている。
% set autologout 30
とすると、30分間ユーザからの入力がない場合、自動ログアウトしてしまう。

ただし、X Window System を使って、kterm を何枚も開いているような場合は、全ての kterm に平均的に入力を行うことはありえないため、自動ログアウト機能は邪魔だと感じることが多いだろう。
% unset autologout
とすると、自動ログアウト機能が OFF になり、どれだけ時間が経とうとログアウトしなくなる。

cwd 環境変数 PWD と同じ。

現在のカレントディレクトリが設定されている。

echo_style echo での改行の処理の設定

普通 echo コマンドは
% echo test
test
%(カーソルはここ)
と自動的に改行されるが、
% echo test
test%(カーソルはここ)
と、改行させたくない場合がある。FreeBSD など BSD 系の /bin/echo は -n で改行しないようにできるが、SystemV 系の /bin/echo は文字列の最後に「\c」を付けることで改行を抑制する。

tcsh では echo_style を設定することで、どらの改行抑止の方法を取るか指定できる。
% set echo_style=bsd
⇒ echo -n hoge で改行抑止
% set echo_style=sysv
⇒ echo 'hoge\c' で改行抑止
% set echo_style=both
⇒ -n と \c 両方とも有効
% set echo_style=none
⇒ -n と \c いずれも改行抑止しない
シェル変数 echo_style と関係あるのは、tcsh 内部コマンドの echo であって、/bin/echo は全く影響を受けないことに注意。

fignore ファイル名の補完時に候補から外すファイル名

*.o、*~、*.log、*.auxというファイルを補完候補から外したい場合は
% set fignore = (.o \~ .aux .log)
とする。

この設定は tcsh の Ctrl-D・TAB によるファイル補完に対しても有効である。上記の通り fignore が設定してあった場合、
% complete foo 'p/1/f:bar*/'
として、カレントディレクトリに bar.c・bar.o が存在した場合、
% foo (Ctrl-D)
bar.c
と bar.o は補完対象にならない。

filec ファイル名の補完を行う (csh のみ)

csh でのファイル名補完機能を ON にする。知らない人も多いようだが、csh でも ESC キーを押すことでファイル名の補完ができる。
% set filec (ファイル名補完を ON)
% ls
sample hoge.c hoge.dat
% ls s (ここでESC を押す)
% ls sample (ファイル名が補完される)
% ls h (ここでESC を押す)
% ls hoge. (選択肢が 2つあるので補完されるのはここまで)
% ls hoge.d (d を入力して、ESC キーを押す)
% ls hoge.dat (完全なファイル名が補完される)
% unset filec (ファイル名補完を OFF)

tcsh ではデフォルトで補完が行われるので、filec をセットしても意味はない。

gid グループ ID

グループ名は内部では数字に置き換えられて扱われる。

group 環境変数 GROUP と同じ

home 環境変数 HOME と同じ

history ヒストリに保存するコマンドの最大数を指定

set history = 1000 とすると過去に実行した1000個のコマンドを、シェルが記憶する。ただし、一度シェルを終了すると全部忘れてしまう。シェルを終了しても覚えさせておくには、シェル変数 savehist で設定する。

ignoreeof Ctrl-D でログアウトしないようにする。

デフォルトでは、何もタイプしていない状態で Ctrl-D を押すとログアウトしてしまう。
% hoge(Ctrl-D)
⇒ hoge から始まるコマンドの一覧を表示
% (Ctrl-D)
exit
⇒ 何もタイプしていない状態だと、Ctrl-D でログアウト

ignoreeof がセットしてあれば Ctrl-D でログアウトしない。普通、補完や文字削除で Ctrl-D を多用するだろうから、操作ミスでログアウトしてしまわないように、ignoreeof をセットしておく方がよい。
% set ignoreeof
⇒ Ctrl-D でログアウトしない
% unset ignoreeof
⇒ Ctrl-D でログアウトする
ちなみに十数回連続で Ctrl-D を押すと、ignoreeof がセットしてあってもログアウトする。どうやら、こういう仕様らしい。

mail メールが保管されるファイル名 (メールスプール)

メールが届くと、コマンドラインに
You have new mail.
と表示される。これはシェルが定期的にメールスプールを調べ、新着メールがないかチェックしているからである。

普通、メールスプール名は /var/mail か /var/spool/mail なので、
% set mail = /var/mail/$USER
% set mail = /var/spool/mail/$USER
などと設定しておくとよい。

nobeep ファイルの補完に失敗したときに BEEP 音を鳴らさない

BEEP 音は xset コマンドで設定する方がいいかも。

notify ジョブの終了をすぐに知らせる

デフォルトの場合、バックグラウンドジョブが終了すると
% sleep 2 &
(十分に時間が経った後でリターンを押す)
[1]   Done         command
というふうに、プロンプトが表示される時点まで、ジョブの終了が表示されない。set notifyとすると、
% set notify
% sleep 2 &
[1]   Done         command
リターンを押さなくても、ジョブが終了した瞬間に表示される。

path 環境変数 PATH と同じ

詳しい説明は環境変数 PATH の項で行う。

シェル変数 path を変更すると、即座に環境変数 PATH にも反映される。逆も同じである。つまり、パスを設定するには、シェル変数 path を設定してもよいし、環境変数 PATH を設定してもよいということである。

prompt プロンプトを設定

プロンプト(コマンド入力待ちのときに表示する文字列)を設定する。
% set prompt="% "
とすると、プロンプトは「% 」となる(これはデフォルト)。
% set prompt="`hostname -s`-\>$USER: "
とすると、「ホスト名->ユーザ名: 」になる。

また、\! はヒストリ番号に置換される。
% set prompt="`hostname -s`-\>$USER:{\!} "
とすると、\! の部分はひとつコマンドを実行するごとに 1ずつ値が増えていく。

バッククォートで囲った部分はプロンプト表示のたびに毎回実行されるわけではなく、set の時点で一度だけ実行される。よって、毎回カレントディレクトリを表示させるつもりで
% set prompt=`pwd`
としてもディレクトリ表示は変化しない。この場合、%/ %~ などの特殊変数を使うとよい (tcsh のみ)。

以下は tcsh のみがサポートする特殊文字列。
%/ … カレントディレクトリ
%~ … カレントディレクトリ。ただし、ホームディレクトリは ~ として表示される。
% cd ~/bin
% set prompt="%/:"
/home/username/bin:
% set prompt="%~:"
~/bin:
%c … カレントディレクトリの最後のディレクトリ名。その後に数字を付けると、最後のn個分のディレクトリ名となる。
% cd /usr/X11R6/lib/X11
% set prompt="%c: "
X11:
% set prompt="%c3:" (後ろから数えて3つのディレクトリを表示)
X11R6/lib/X11:
%S … 反転表示開始(%sで終了)
%B … 太字(bold)表示開始(%bで終了)
%U … 下線(アンダーライン)表示開始(%uで終了)
% set prompt="%Sabc%s%Bdef%b%Ughi%u:"
abc<b>def</b><u>ghi</u>:
%Y … 西暦。4桁表示
%y … 西暦。2桁表示
%w … 月。Jun〜Dec表示
%W … 月。1〜12表示
%d … 曜日。Sun〜Sat表示
%D … 日。1〜31日
%t … 現在時刻。何時何分単位。12時間表示。末尾にam/pmが付く。
%T … 現在時刻。何時何分単位。24時間表示。
%p … 現在時刻。何時何分何秒単位。12時間表示。末尾にam/pmが付く。
%P … 現在時刻。何時何分何秒単位。24時間表示。
% set prompt="%Y-%W-%D(%d) %P %t: "
1999-06-26(Sat) 13:04:37 1:04pm:

prompt2 サブプロンプト

例えば
% while (1) (リターン)
while?
% foreach i ($path)
foreach?
としたときに「while?」や「foreach?」などのプロンプトは、prompt2 が使われる。デフォルトは「%R?」である。%R は直前に入力した while や foreach などが設定される。

rmstar rm コマンドで * を指定したときに確認を求める。tcsh のみ。

rm コマンドの引数に * を渡すと、カレントディレクトリにある全てのファイルが消去されてしまう。
% rm *~
とするつもりで、
% rm * ~ (間に空白がはさまっている)
としてしまうと、泣くに泣けない。

そこで、シェル変数 rmstar をセットしておくと、rm の引数に * を指定したとき、本当に消してもよいかどうか確認を求めてくる。
% set rmstar
% rm *
Do you really want to delete all files? [n/y]
⇒ y を押すと消去。それ以外のキーを押すと消去しない
% unset rmstar
% rm *
⇒ rmstar をクリアすると、問答無用で全ファイルを消去

savehist ログアウト時に~/.history に保存する履歴の数

シェルを終了すると、そのとき保持しているヒストリ情報が ~/.history に書き込まれる。次回シェルを起動したときに ~/.history が読まれて、前回のヒストリ情報を引き続き使う。savehist はシェルの終了時に ~/.history に保存するコマンドの数を指定する。
% set savehist=1000
とすると、現在からさかのぼって 1000個のコマンドが ~/.history に保存される。

ただし、X上で複数の kterm を開いた場合、結局最後に終了したシェルが ~/.history を上書きしてしまい、その他のシェルのヒストリ情報は残らない。tcsh なら
% set savehist = (1000 merge)
とすることで、全てのシェルのヒストリがマージされて保存される。

uid ユーザ ID。ログインネームは内部では数字に置き換えられて扱われる。

user 環境変数 USER と同じ。

ユーザ名が保存されている。