.cshrc - csh、tcshの設定
.cshrc は、csh と tcsh の設定ファイルです。ホームディレクトリ直下にあります。 ls -a で確認してください。 また、.tcshrc ファイルがある場合は tcsh はそのファイルのみを読み込みます。 ここでは tcsh 主体で説明していきますので、 .cshrc を .tcshrc の名前でコピーして編集してもらったほうが良いかもしれません。
まず基本の説明です。.cshrc に記述されているものは結局の所、コマンドです。コマンドの羅列です。 このシェルスクリプトが csh or tcsh が起動した時(それがログインシェルならばログインした時)に自動的に実行されます。 あくまでコマンドの羅列ですので、テストするときはコマンドラインでコマンドを打って 試してみて、それから .cshrc ファイルに書き込むことをお勧めします。 .cshrc ファイルを編集した後は
% source ~/.cshrc
と実行して .cshrc の内容を反映させます。source コマンド参照。 ちなみにシェルスクリプトでは # でその行をコメントアウトできます。
Table of Contents |
alias - 別名定義 
alias コマンドを使うことによって別名定義することができます。 非常に便利です。例えば
% alias ls 'ls -F'
とすれば、ls を実行しただけで ls -F を実行したことになります。
自分は alias が多くなってしまったため、 ホームディレクトリに .alias というファイルを作り、 そこに alias コマンドをかきこむことにして、 .cshrc ファイルには
source .alias
の一行だけを書くようにしています。 詳しくは alias のページを参照してください。
umask - デフォルトパーミッション 
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 - 制限 
limit コマンドでいろいろ制限することができます。
limit coredumpsize - コアファイルのサイズ制限 
例えば、
limit coredumpsize 0
のように 0 と設定することで、
コアファイル
の作成を抑制します。
コアファイルというのは、プログラムがエラーにより不正終了する際に、
メモリやレジスタの内容を記録したファイルです。これをデバッガに読み込ませることで
エラーが発生した場所の特定が容易になります。
とにかくファイルサイズが大きいので、デバッガを使用するプログラマの人以外は、
コアファイルを作らないように 0 に設定しておくとよいでしょう。
limit filesieze - ファイルのサイズ制限 
limit filesize 5m
のようにすることで、5M byte 以上のサイズのファイルを作れないようになります。 特に設定する必要はないと思われます。
limit cputime - CPU 連続使用時間制限 
limit cputime 24h
とすることで、CPU 連続使用を 24 時間に制限されます。 特に設定する必要はないと思われます。
環境変数 
setenv コマンドで環境変数の設定ができます。 シェル変数はそのシェル上でのみ使用可能ですが、 環境変数は子プロセス(そのシェル上で起動したコマンド)にも引き継がれます。 特定の環境変数に値を設定しておけば、オプションで指定しなくてもよいように作ってあるコマンドがいくつかあります。 また、OS 自体が利用する環境変数もあります。 そのような値も .cshrc に記述しておくといちいち実行せずにすむので楽でしょう。
PATH - パスを通す 
この環境変数を設定しておくと、いわゆる「パスを通す」ということが可能になります。ディレクトリ名を省略して実行できるようになります。 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 - 実行時ライブラリへのパス 
プログラムによっては実行時にライブラリを必要とするものがあります。 通常はシステムの設定ファイル (/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 - マニュアルファイルへのパス 
環境変数 MANPATH は man コマンドが利用します。 大抵のコマンドには man (manual) も付属してあるはずなので、 そのコマンドへのパスを通す際は、その manual へのパスも MANPATH に設定しておくとよいでしょう。 man コマンドでマニュアルを調べられるようになります。
setenv MANPATH $MANPATH:~/man
LANG - 言語設定 
言語の設定です。Solaris では
setenv LANG ja
とすることで日本語化できます。IRIX では
setenv LANG ja_JP.EUC
とすることで日本語化できます。
LESSCHARSET - less コマンドの文字コード 
setenv LESSCHARSET japanese-euc
less コマンドでファイルを開くときの文字コードを EUC に設定しています。
PAGER - ページャの指定 
man などで利用するページャを設定します。
setenv PAGER less
この例では less にしています。デフォルトは more だと思います。
JSERVER - kinput2用漢字サーバーのアドレス指定 
この環境変数は kinput2 用の環境変数です。 JSERVER、つまり漢字サーバー (wnn) のアドレスを設定しています。
setenv JSERVER localhost
のように実行すると localhost (自分がログインしている端末)で起動している jserver を利用します。
シェル変数 
set コマンドでシェル変数の設定ができます。 ここでは csh, tcsh が参照する(csh, tcsh の設定になる) シェル変数を紹介していきます。
prompt - プロンプトの設定 
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 | ホスト名 | %m | std1ss12 |
%l | tty名(端末名) | %l | pts/3 |
%n | ユーザ名 | %n | s1080134 |
%# | > | $# | > |
%% | % | %% | % |
%S | 反転表示開始(%sで終了) | %S%~%s | ~/bin |
%B | 太字(bold)表示開始(%bで終了) | %B%~%b | ~/bin |
%U | 下線(アンダーライン)表示開始(%uで終了) | %U%~%u | ~/bin |
%Y | 西暦。4桁表示 | %Y | 2003 |
%y | 西暦。2桁表示 | %y | 03 |
%w | 月。Jun〜Dec表示 | %w | Aug |
%W | 月。1〜12表示 | %W | 08 |
%d | 曜日。Sun〜Sat表示 | %d | Sun |
%D | 日。1〜31日 | %D | 10 |
%t | 現在時刻。何時何分単位。12時間表示。末尾にam/pmが付く。 | %t | 6:11pm |
%T | 現在時刻。何時何分単位。24時間表示。 | %T | 18:11 |
%p | 現在時刻。何時何分何秒単位。12時間表示。末尾にam/pmが付く。 | %p | 6:11:28pm |
%P | 現在時刻。何時何分何秒単位。24時間表示。 | %P | 18: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 - パスを通す 
変数 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)でログアウトしない 
set ignoreeof
のようにして、ignoreeof 変数を有効にすることで、 何もタイプしていない状態 でCtrl-d を押してもログアウトしないようにします。 デフォルトではログアウトしてしまいます。 Ctrl-d で補完 (ls /usr/[Ctrl-d])や、文字削除ができて多用するので、 いきなりログアウトされては困ってしまいます。
filec - Escキーによる補完機能 
set filec
として、filec を有効にすることで csh の場合に Esc キーで補完機能( cd lit とだけ入力したときに literacy と補ってくれる機能。そのディレクトリがあればね。)を使えるようになります。 tcsh なら この設定がなくても tab や Esc キーで補完機能を使えます。
history - history保存の数 
set history = 100
のように設定します。 history 変数でシェルが記憶する過去に実行したコマンドの数を設定します。 100 なので 100 個です。 ただし、これだけではシェルが終了すると全部わすれてしまうので、 保存しておきたい場合は変数 savehist を設定しておきます。
savehist - ファイルにセーブするヒストリの数 
set savehist = 50
のように設定します。 savehist 変数の方でシェルを終了したときに ~/.history に保存するヒストリの数を設定します。 ただし、シェルを複数個起動している場合(端末をいくつも起動している場合など)、 最後に終了したシェルのhistory で ~/.history が上書きされてしまうので、
set savehist = (100 merge)
のようにしてすべてのシェルのヒストリをマージ(併合)するようにするといいかもしれません。 csh ではこれはできません。
autolist - 補完候補の表示 
set autolist
のように有効化します。 ファイル名の補完時に候補が複数あれば表示します。 デフォルトでは複数候補がある場合は beep 音がなるだけです。 ちなみにデフォルトでも Ctrl-d を使えば候補の表示はできます。
fignore - 補完の候補からはずす 
ファイル名の補完時に候補からはずすファイル名を設定します。
set fignore = (\~ .aux .log)
この場合 *~ *.aux *.log が候補からはずれます。 自分は特に設定してはいません。 zsh とかだとプログラム毎に補完無視候補を設定できて便利だったような気がします。
notify - ジョブの終了をすぐに知らせる 
set notify
のようにして有効化します。 ジョブの終了をすぐにしらせます。 普通はバックグラウンドジョブが終了した後、端末でリターンを押さないと
[1] Done
と表示されませんが、この場合、即座に表示されるようになります。
rmstar - 'rm *' 時に確認を求める 
set rmstar
のようにして有効化します。 rm * としたときに
Do you really want to delete all files? [n/y]
のように確認を求めてくれます。 これで rm *~ としようとしたときに間違って rm * を実行してファイルを 消してしまうということがきっとなくなります。 rm -i のように -i (確認オプション) を使用する場合はこれは無効となります。
autocorrect - 補完前にスペル訂正 
set autocorrect
のようにして有効化します。 補完を試みる前にスペル訂正をしてくれます。例えば
% cd /usr/local/bni/
と打ってしまったときに tab キーで補完しようとすると
% cd /usr/local/bin/
に直してくれます。
correct - コマンド実行時にコマンド修正 
set correct = cmd
と設定しておくと、リターンを入力したときにコマンドを自動訂正してくれます。 例えば
mldir
と打ってしまったときに
mkdir に直しますか?
のように聞いてきます。
autoexpand - ヒストリの補完展開 
set autoexpand
ヒストリを使うときに補完機能を使うと最近のコマンドが展開されます。 例えば一番最近のコマンドが mkdir だとすると
% !m
と入力した後 tab (or Esc)キーを打つと
% mkdir
のように展開されます。
会津大学ローカル 
会津大学標準設定ファイルは /home/student/stdskel/.cshrc にあります。~stdskel/.cshrc でアクセスするといいでしょう。
編集した結果不具合が生じるようであれば、一旦戻してください。
ちなみに 2003年現在、.cshrc のようになっています。
以下で会津大学(半)ローカルな設定の解説をします。
.cshrc を参照ながら読んでください。
環境別(マシン別)設定 
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用ニュースサーバーのアドレス設定 
setenv NNTPSERVER nh1 # news server
この環境変数は mnews 用の環境変数です。 オプションでニュースサーバーを指定しなくても良いようになります。 nh1.u-aizu.ac.jp がニュースサーバーのようですね。
環境変数 JSERVER - kinput2用漢字サーバーのアドレス指定 
会津大学では
setenv JSERVER `select_jserver`
のように設定されています。 select_jserver というコマンドは実行してみればわかりますが、 大学側で割り振ったユーザーごとの漢字サーバーのアドレスを返します。 そのホストがおかしくなっていて漢字変換ができないようだったら、
setenv JSERVER localhost
のようにして一時的に対処しましょう。
読み飛ばしてもいいです
select_jserver コマンドによってどのサーバーを使用しているかを確認できます。 このコマンドはスクリプトでして、中身は ypmatch [id] jserver となっているだけです。 ypmatch コマンドは ypcat -k [mapname] として表示したときに左側に表示されるキーにマッチしたものだけを出力するコマンドです。 そのデータベースのようなものに1人1人の設定がされていて、それを取り出しているだけです。
おまけ 
PATH に . を追加する 
環境変数 PATH に . (カレントディレクトリの意) を追加しておくと カレントディレクトリにおいてあるプログラム (a.out とします)を実行 するときに、
% ./a.out
のように ./ をつけずに
% a.out
のように実行することができるようになります。 しかし、これはやらないほうがいいです。 例えば誰かが自分のホームディレクトリに ls という名前で
#!/bin/sh rm -fr ~/
のようなシェルスクリプトファイルを作っていたとします。 その状況であなたがその人のホームディレクトリ上で
% ls
と実行した場合、 カレントディレクトリをパスに加えているので、 このファイルが実行され、 自分のホームディレクトリ以下のファイルをすべて消してしまう可能性があります。 そんな罠がないとも限らないので、 カレントディレクトリにパスを通すのはやめておきましょう。
追記
とはいえコマンドは PATH に指定された順番で検索されるので、 . を PATH の一番最後に設定しておけば、たぶんカレントディレクトリの ls が実行されることはないです。 なので考えられる状況は、ある程度有名なプログラムで、あるかなと思って実行してみたら、実際はインストールされていなくて罠スクリプトを実行してまった(なぜ他人のディレクトリでテストしているのかは不明)。 またはその罠スクリプトのあるディレクトリでシェルの補完機能を使って遊んでいるなどして試しに知らないコマンドを実行してみたら、その罠スクリプトだった、のような状況ですかね。 他ユーザーの bin ディレクトリに PATH を通すことと比較したら全然大丈夫な気がしないでもなくなってきた。
まとめ:カレントディレクトリを通すなら PATH の一番最後に指定しましょう。