.cshrc - csh、tcshの設定


.cshrc は、cshtcsh の設定ファイルです。ホームディレクトリ直下にあります。 ls -a で確認してください。 また、.tcshrc ファイルがある場合は tcsh はそのファイルのみを読み込みます。 ここでは tcsh 主体で説明していきますので、 .cshrc を .tcshrc の名前でコピーして編集してもらったほうが良いかもしれません。

まず基本の説明です。.cshrc に記述されているものは結局の所、コマンドです。コマンドの羅列です。 このシェルスクリプトが csh or tcsh が起動した時(それがログインシェルならばログインした時)に自動的に実行されます。 あくまでコマンドの羅列ですので、テストするときはコマンドラインでコマンドを打って 試してみて、それから .cshrc ファイルに書き込むことをお勧めします。 .cshrc ファイルを編集した後は

% source ~/.cshrc

と実行して .cshrc の内容を反映させます。source コマンド参照。 ちなみにシェルスクリプトでは # でその行をコメントアウトできます。

Table of Contents

alias - 別名定義 Edit

alias コマンドを使うことによって別名定義することができます。 非常に便利です。例えば

% alias ls 'ls -F'

とすれば、ls を実行しただけで ls -F を実行したことになります。

自分は alias が多くなってしまったため、 ホームディレクトリに .alias というファイルを作り、 そこに alias コマンドをかきこむことにして、 .cshrc ファイルには

source .alias

の一行だけを書くようにしています。 詳しくは alias のページを参照してください。

umask - デフォルトパーミッション Edit

umask コマンドでデフォルトパーミッションの設定ができます。 例えば

% umask 022

のように実行します。 パーミッションについては chmod の知識が必要となります。 chmod のページを読んで理解しておいてください。

umask の場合 chmodの値と反対になります。 chmod の場合 +w の意味で、2の値が与えられていましたが、 umask の場合 -w の意味で、2の値が与えられています。つまり 022 とした場合、 ディレクトリを作った場合のデフォルト許可は

drwxr-xr-x

ということになります。ファイルを作った場合は実行許可 x は最初からはつかないので、

-rw-r--r--

のようになります。応用としては

umask 072

のようにしてやれば、デフォルトでグループの許可がすべてなくなります。

会津大学の Prog0 や literacy の授業で作ったファイルはこのような許可にしないさいという仰せなので、 chmod の手間が省けていいかもしれません。(実際は Prog0, literacy ディレクトリのグループ 許可を消してしまいさえすれば問題はないので、自分はやりませんでしたが・・・)

limit - 制限 Edit

limit コマンドでいろいろ制限することができます。

limit coredumpsize - コアファイルのサイズ制限 Edit

例えば、

limit coredumpsize 0 

のように 0 と設定することで、 コアファイル の作成を抑制します。 コアファイルというのは、プログラムがエラーにより不正終了する際に、 メモリやレジスタの内容を記録したファイルです。これをデバッガに読み込ませることで エラーが発生した場所の特定が容易になります。 とにかくファイルサイズが大きいので、デバッガを使用するプログラマの人以外は、 コアファイルを作らないように 0 に設定しておくとよいでしょう。

limit filesieze - ファイルのサイズ制限 Edit

limit filesize 5m

のようにすることで、5M byte 以上のサイズのファイルを作れないようになります。 特に設定する必要はないと思われます。

limit cputime - CPU 連続使用時間制限 Edit

limit cputime 24h

とすることで、CPU 連続使用を 24 時間に制限されます。 特に設定する必要はないと思われます。

環境変数 Edit

setenv コマンドで環境変数の設定ができます。 シェル変数はそのシェル上でのみ使用可能ですが、 環境変数は子プロセス(そのシェル上で起動したコマンド)にも引き継がれます。 特定の環境変数に値を設定しておけば、オプションで指定しなくてもよいように作ってあるコマンドがいくつかあります。 また、OS 自体が利用する環境変数もあります。 そのような値も .cshrc に記述しておくといちいち実行せずにすむので楽でしょう。

PATH - パスを通す Edit

この環境変数を設定しておくと、いわゆる「パスを通す」ということが可能になります。ディレクトリ名を省略して実行できるようになります。 csh, tcsh では連動するシェル変数 path が用意されており、どちらでも設定することが可能になっています。

setenv PATH /bin:/usr/local/bin

のように設定されてあれば、コマンド実行時に /bin ディレクトリ、/usr/local/bin ディレクトリ内のコマンドはディレクトリ名を省略して、コマンド名だけで(ファイル名だけで)実行できるようになります。

同じコマンドが両方のディレクトリにある場合は、パスの先頭に近いほうが優先されます。 この例では /bin が優先されています。 大抵は /usr/local/bin 内にあるプログラムのほうがバージョンが新しいのでそちらを頭にもっていったほうがよいはずです。

パスを追加する場合は、

setenv PATH ${PATH}:~/bin

のようにします。この際、 ~/bin を優先したいのならば、

setenv PATH ~/bin:${PATH}

のようにするということになります。

LD_LIBRARY_PATH - 実行時ライブラリへのパス Edit

プログラムによっては実行時にライブラリを必要とするものがあります。 通常はシステムの設定ファイル (/etc/ld.so.conf?) で /usr/lib, /usr/local/lib などのへのパスがすでに設定されています。 その他のパスはユーザー自身で LD_LIBRARY_PATH を設定します。

会津大学では X のライブラリへのパスが通っていないようなので、 LD_LIBRARY_PATH を用いて自分で追加します。

setenv LD_LIBRARY_PATH /usr/local/X11R6.4/lib

/usr/local/X11R6.4/lib を追加しておくと X のライブラリを使うプログラム (GUI なゲームなど)が起動できるようになります。

自分でライブラリをインストールしたときにも、LD_LIBRARY_PATH を使用します。

(読み飛ばしてもいいです。)
LD_LIBRARY_PATH には .so (Dynamic Shared Object) なファイルがあるディレクトリを指定します。 Windows でいえば .dll (Dynamic Link Library) のようなものです。 コンパイル時にリンクしておくのではなく、 ダイナミック (プログラム実行時) にリンクさせるのです。 気になったら、 ダイナミックリンクライブラリでも見ておいてください。

MANPATH - マニュアルファイルへのパス Edit

環境変数 MANPATH は man コマンドが利用します。 大抵のコマンドには man (manual) も付属してあるはずなので、 そのコマンドへのパスを通す際は、その manual へのパスも MANPATH に設定しておくとよいでしょう。 man コマンドでマニュアルを調べられるようになります。

setenv MANPATH $MANPATH:~/man

LANG - 言語設定 Edit

言語の設定です。Solaris では

setenv LANG ja

とすることで日本語化できます。IRIX では

setenv LANG ja_JP.EUC

とすることで日本語化できます。

LESSCHARSET - less コマンドの文字コード Edit

less コマンドがこの変数を使用します。

setenv LESSCHARSET japanese-euc 

less コマンドでファイルを開くときの文字コードを EUC に設定しています。

PAGER - ページャの指定 Edit

man などで利用するページャを設定します。

setenv PAGER less

この例では less にしています。デフォルトは more だと思います。

JSERVER - kinput2用漢字サーバーのアドレス指定 Edit

この環境変数は kinput2 用の環境変数です。 JSERVER、つまり漢字サーバー (wnn) のアドレスを設定しています。

setenv JSERVER localhost

のように実行すると localhost (自分がログインしている端末)で起動している jserver を利用します。

シェル変数 Edit

set コマンドでシェル変数の設定ができます。 ここでは csh, tcsh が参照する(csh, tcsh の設定になる) シェル変数を紹介していきます。

prompt - プロンプトの設定 Edit

prompt 変数を設定することでプロンプト(コマンド入力待ちのときに表示する文字列)を設定できます。

set prompt="`hostname`{`whoami`}\!: "

のように設定します。この設定では

std1ss12{s1080134}50: 

のように表示されているはずです。\! はヒストリ番号に置換されます。 後は \n の改行や \t のタブ文字なども使えます。以下は tcsh がサポートしている特殊文字列。 カレントディレクトリが /home/student/username/bin だと仮定します。

特殊文字列意味用例表示例
%/カレントディレクトリ%/:/home/student/username/bin:
%~カレントディレクトリ。ホームディレクトリが ~ と表示%~:~/bin:
%c or %C or %.カレントディレクトリの最後のディレクトリ名。その後に数字を付けると、最後のn個分のディレクトリ名となる。%c3:student/username/bin:
%?今のコマンドの戻り値%?1
%h or %!ヒストリ番号%!40
%m or %Mホスト名%mstd1ss12
%ltty名(端末名)%lpts/3
%nユーザ名%ns1080134
%#>$#>
%%%%%%
%S反転表示開始(%sで終了)%S%~%s~/bin
%B太字(bold)表示開始(%bで終了)%B%~%b~/bin
%U下線(アンダーライン)表示開始(%uで終了)%U%~%u~/bin
%Y西暦。4桁表示%Y2003
%y西暦。2桁表示%y03
%w月。Jun〜Dec表示%wAug
%W月。1〜12表示%W08
%d曜日。Sun〜Sat表示%dSun
%D日。1〜31日%D10
%t現在時刻。何時何分単位。12時間表示。末尾にam/pmが付く。%t6:11pm
%T現在時刻。何時何分単位。24時間表示。%T18:11
%p現在時刻。何時何分何秒単位。12時間表示。末尾にam/pmが付く。%p6:11:28pm
%P現在時刻。何時何分何秒単位。24時間表示。%P18:11:28pm

エスケープシーケンスを利用することで文字色を設定したりすることができます。 エスケープシーケンスは '\e[コードm' もしくは '^[[コードm' と記入します。 そして、tcsh では エスケープシーケンスを安全に利用するために %{ %} ではさみます。 コードは

00 … 初期状態へ、理解しない端末もある。そういうときはコードなしで。
01 … bold(太字)
04 … アンダーライン
05 … blink(太字になる端末が多い)
07 … reverse(反転)
30 … 文字を black
31 … 文字を red
32 … 文字を green
33 … 文字を yellow
34 … 文字を blue
35 … 文字を magenta
36 … 文字を cyan
37 … 文字を white
40 … 背景を black
41 … 背景を red
42 … 背景を green
43 … 背景を yellow
44 … 背景を blue
45 … 背景を magenta
46 … 背景を cyan
47 … 背景を white

が利用できます。結果、自分の場合は、

set prompt="\!:`hostname`:[%{\e[34m%/\e[m%}]\n"

のようになっています。やっぱりコマンドを打つラインにはなにもないほうが トリプルクリック でコピーしやすいのでいい気がします。%~ ではなく %/ にしているのはこれでユーザー名の表示も兼ねているからです。

path - パスを通す Edit

変数 path は環境変数 PATH と連動する、csh, tcsh 独自の変数です。

set path = (/bin /usr/local/bin/)

のように設定します。 環境変数 PATH とは違い、空白文字が区切り文字になるのでワイルドカードを使って指定できるので便利です (e.g, /usr/local/{gnu,X11R6}/bin) 。 また、

set path = (/bin \
            /usr/local/bin)

のように \ を使用して複数行に渡って記述するときも、空白を気にしなくてすむので楽です。 sh, bash 系にもあったらいいのに。

ignoreeof - EOF(Ctrl+d)でログアウトしない Edit

set ignoreeof

のようにして、ignoreeof 変数を有効にすることで、 何もタイプしていない状態 でCtrl-d を押してもログアウトしないようにします。 デフォルトではログアウトしてしまいます。 Ctrl-d で補完 (ls /usr/[Ctrl-d])や、文字削除ができて多用するので、 いきなりログアウトされては困ってしまいます。

filec - Escキーによる補完機能 Edit

set filec

として、filec を有効にすることで csh の場合に Esc キーで補完機能( cd lit とだけ入力したときに literacy と補ってくれる機能。そのディレクトリがあればね。)を使えるようになります。 tcsh なら この設定がなくても tab や Esc キーで補完機能を使えます。

history - history保存の数 Edit

set history = 100 

のように設定します。 history 変数でシェルが記憶する過去に実行したコマンドの数を設定します。 100 なので 100 個です。 ただし、これだけではシェルが終了すると全部わすれてしまうので、 保存しておきたい場合は変数 savehist を設定しておきます。

savehist - ファイルにセーブするヒストリの数 Edit

set savehist = 50

のように設定します。 savehist 変数の方でシェルを終了したときに ~/.history に保存するヒストリの数を設定します。 ただし、シェルを複数個起動している場合(端末をいくつも起動している場合など)、 最後に終了したシェルのhistory で ~/.history が上書きされてしまうので、

set savehist = (100 merge)

のようにしてすべてのシェルのヒストリをマージ(併合)するようにするといいかもしれません。 csh ではこれはできません。

autolist - 補完候補の表示 Edit

set autolist

のように有効化します。 ファイル名の補完時に候補が複数あれば表示します。 デフォルトでは複数候補がある場合は beep 音がなるだけです。 ちなみにデフォルトでも Ctrl-d を使えば候補の表示はできます。

fignore - 補完の候補からはずす Edit

ファイル名の補完時に候補からはずすファイル名を設定します。

set fignore = (\~ .aux .log)

この場合 *~ *.aux *.log が候補からはずれます。 自分は特に設定してはいません。 zsh とかだとプログラム毎に補完無視候補を設定できて便利だったような気がします。

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

set notify

のようにして有効化します。 ジョブの終了をすぐにしらせます。 普通はバックグラウンドジョブが終了した後、端末でリターンを押さないと

[1]   Done

と表示されませんが、この場合、即座に表示されるようになります。

rmstar - 'rm *' 時に確認を求める Edit

set rmstar

のようにして有効化します。 rm * としたときに

Do you really want to delete all files? [n/y]

のように確認を求めてくれます。 これで rm *~ としようとしたときに間違って rm * を実行してファイルを 消してしまうということがきっとなくなります。 rm -i のように -i (確認オプション) を使用する場合はこれは無効となります。

autocorrect - 補完前にスペル訂正 Edit

set autocorrect

のようにして有効化します。 補完を試みる前にスペル訂正をしてくれます。例えば

% cd /usr/local/bni/

と打ってしまったときに tab キーで補完しようとすると

% cd /usr/local/bin/

に直してくれます。

correct - コマンド実行時にコマンド修正 Edit

set correct = cmd

と設定しておくと、リターンを入力したときにコマンドを自動訂正してくれます。 例えば

mldir

と打ってしまったときに

mkdir に直しますか?

のように聞いてきます。

autoexpand - ヒストリの補完展開 Edit

set autoexpand

ヒストリを使うときに補完機能を使うと最近のコマンドが展開されます。 例えば一番最近のコマンドmkdir だとすると

% !m

と入力した後 tab (or Esc)キーを打つと

% mkdir

のように展開されます。

会津大学ローカル Edit

会津大学標準設定ファイルは /home/student/stdskel/.cshrc にあります。~stdskel/.cshrc でアクセスするといいでしょう。 編集した結果不具合が生じるようであれば、一旦戻してください。 ちなみに 2003年現在、file.cshrc のようになっています。 以下で会津大学(半)ローカルな設定の解説をします。file.cshrc を参照ながら読んでください。

環境別(マシン別)設定 Edit

if ( -x /usr/bin/arch )set machine=`/usr/bin/arch`  # SunOS
if ( -x /usr/ucb/arch )set machine=`/bin/uname -r`  # Solaris
if ( -x /usr/bsd )set machine=`/usr/bin/uname -s`   # SGI
if ( -f /stand/vmunix )set machine=`/bin/uname -r`  # HP
if ( -d /usr/sony )set machine=`/usr/bin/uname -r`  # NEWS

のようにしてシェル変数 machine を作成しています。 会津大学の .cshrc では、この変数の値で環境を見極め、環境別の設定をさせています。

switch( $machine )

# for Solaris 2.x
case 5.*:
breaksw

# for SGI irix
case IRIX*:
breaksw

# for HP HP-UX 11.00
case B.11.00:
breaksw

case 6.1.1:
case 6.1.2:
breaksw

endsw

のような記述があると思います。

# for Solaris 2.x
case 5.*:
・・・・・
breaksw

ここでは SunSoft社(Sun Microsystems社の子会社)のSolaris OS (std1,2,3,4、hdw1,2、cai1,2) での設定を行います。

# for SGI irix
case IRIX*:
・・・・・
breaksw

ここでは SGI社のIRIX OS(std5,6) での設定を行います。 IRIX は会津大生には不評なので、いつか消えるかもしれません。 別の OS があることで学べることも多いので残るかもしれません(ほぼ消えたらしいですね)。

# for HP HP-UX 11.00
case B.11.00:
・・・・・
breaksw

ここでは HP OS の設定って、HP ってどこの演習室?すんまそん。

case 6.1.1:
case 6.1.2:
・・・・・
breaksw

ここでは SONY 社の NEWS OS (lml1,2)での設定を行います。あまり使うことがないので、特になにもありません。

例えば IRIX と Solaris での設定を別にしたい環境変数 LANG については、

switch( $machine )

# for Solaris 2.x
case 5.*:
	setenv LANG ja
breaksw

# for SGI irix
case IRIX*:
	setenv LANG ja_JP.EUC
breaksw

# for HP HP-UX 11.00
case B.11.00:
breaksw

case 6.1.1:
case 6.1.2:
breaksw

endsw

のように分けて設定するとグッドです。 同様に環境変数 PATH (シェル変数 path) なども分けて設定することが可能です。

環境変数 NNTPSERVER - mnews用ニュースサーバーのアドレス設定 Edit

setenv NNTPSERVER nh1 # news server

この環境変数は mnews 用の環境変数です。 オプションでニュースサーバーを指定しなくても良いようになります。 nh1.u-aizu.ac.jp がニュースサーバーのようですね。

環境変数 JSERVER - kinput2用漢字サーバーのアドレス指定 Edit

会津大学では

setenv JSERVER `select_jserver`

のように設定されています。 select_jserver というコマンドは実行してみればわかりますが、 大学側で割り振ったユーザーごとの漢字サーバーのアドレスを返します。 そのホストがおかしくなっていて漢字変換ができないようだったら、

setenv JSERVER localhost

のようにして一時的に対処しましょう。

読み飛ばしてもいいです

select_jserver コマンドによってどのサーバーを使用しているかを確認できます。 このコマンドはスクリプトでして、中身は ypmatch [id] jserver となっているだけです。 ypmatch コマンドypcat -k [mapname] として表示したときに左側に表示されるキーにマッチしたものだけを出力するコマンドです。 そのデータベースのようなものに1人1人の設定がされていて、それを取り出しているだけです。

おまけ Edit

PATH に . を追加する Edit

環境変数 PATH に . (カレントディレクトリの意) を追加しておくと カレントディレクトリにおいてあるプログラム (a.out とします)を実行 するときに、

% ./a.out

のように ./ をつけずに

% a.out

のように実行することができるようになります。 しかし、これはやらないほうがいいです。 例えば誰かが自分のホームディレクトリに ls という名前で

#!/bin/sh
rm -fr ~/

のようなシェルスクリプトファイルを作っていたとします。 その状況であなたがその人のホームディレクトリ上で

% ls

と実行した場合、 カレントディレクトリをパスに加えているので、 このファイルが実行され、 自分のホームディレクトリ以下のファイルをすべて消してしまう可能性があります。 そんな罠がないとも限らないので、 カレントディレクトリにパスを通すのはやめておきましょう。

追記

とはいえコマンドは PATH に指定された順番で検索されるので、 . を PATH の一番最後に設定しておけば、たぶんカレントディレクトリの ls が実行されることはないです。 なので考えられる状況は、ある程度有名なプログラムで、あるかなと思って実行してみたら、実際はインストールされていなくて罠スクリプトを実行してまった(なぜ他人のディレクトリでテストしているのかは不明)。 またはその罠スクリプトのあるディレクトリでシェルの補完機能を使って遊んでいるなどして試しに知らないコマンドを実行してみたら、その罠スクリプトだった、のような状況ですかね。 他ユーザーの bin ディレクトリに PATH を通すことと比較したら全然大丈夫な気がしないでもなくなってきた。

まとめ:カレントディレクトリを通すなら PATH の一番最後に指定しましょう。

参考:Manpage of TCSH

xrea