新年の挨拶と、便利なシェル設定(tcsh)

あけましておめでとうございます。毎年のことながら、正月は寝正月をしてしまい、体重が増える一方ですね。
最終人型決戦兵器「牛久大仏」の元を離れ、実家に戻るたびに「この芸人誰?」と思ってしまうわけですが、今年はそもそもテレビを付けないので、そんな思いからは開放されました。
さて、そのテレビを見ていない間にやっていたことの一つとして、Cシェル(tcsh)の設定があります。同じ設定ファイル(.cshrc)を使っていたとしても、linuxMacFreeBSDでは色々変わってきてしまいます。どの環境でも問題なく使いまわせるtcshの設定、というのを少し紹介します。

こんな時:: 同じホームディレクトリがlinux/Mac/BSDで使われる!

NFSサーバが稼働しており、そこからホームディレクトリをマウントするようなシステムがあったとします。そして、そのホームディレクトリが違うOSで使いまわされる!って時は困りますよね。
こんな環境は、大学などではありがちなのですが、このような場合だと.cshrcをlinux向け設定にしてもBSD向け設定にしても困ってしまいます。そんな時は、以下の記述で場合わけしてやりましょう。

if( "$OSTYPE" == "linux" ) then
	alias	ls	"ls --color"
else if( "$OSTYPE" == "darwin" ) then
	alias 	ls	"ls -w -F -G"
else if( "$OSTYPE" == "FreeBSD" ) then
	alias 	ls	"ls -w -F -G"
endif

環境変数OSTYPEを読み出してやって、その中によってaliasの設定を変えてやったり、環境変数の設定を変えてやったりしてやればよいのです。
また、各OS別のバイナリを自分のホーム以下に置いている場合もあるかと思います。そんな時は、linux/bin/やfreebsd/bin/とディレクトリを掘り、そこにバイナリを置いた上で、

if( "$OSTYPE" == "linux" ) then
....
	if ( -d $HOME/linux ) then
		set LOCALBIN = "linux/bin"
	endif
....

というような記述をしてやります。これにより、バイナリが置いてあるディレクトリがあるかないか判定し、もしバイナリが置いてあるディレクトリがあれば、パスを変数にセットします。
そして、パスをセットする記述を

if ( $?LOCALBIN ) then
	set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin $HOME/script $HOME/$LOCALBIN)
else
	set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin $HOME/script )
endif

という記述にしてやることで、上で設定したパスを有効にしてやります。

こんな時:: ssh接続の時、わかりやすくしたい!ついでにrootも!

sshで接続をして、ローカルのマシンのターミナルも開いて、とやっているとどれがどれだか分からなくなってしまいます。また、rootで作業をやっているときに一目で分かるようにもしたい、という場合もあるかと思います。
そんな時は、以下のようにしてやります。

if ($?prompt) then
	# デフォルトの設定をセット
	set SSH = ""
	set PRMPT = '$'
	set PRMPTCOLOR = "32" # green

	# SSH越しの場合
	if ( $?SSH_CLIENT ) then
		set SSH = "ssh"
	endif
	# rootの場合
	if ( "$USER" == "root" ) then
		set PRMPT = '#'
		set PRMPTCOLOR = "31" # red
	endif
	# プロンプトの表示を設定
	set prompt = "[%{\e[01;$PRMPTCOLOR\m%}$USER@`/bin/hostname -s`%{\e[0m%} %c]%{\e[01;35m%}$SSH%{\e[0m%}$PRMPT "
....
endif

SSH越しの場合は環境変数 SSH_CLIENTの中に接続元ipがかかれています。ただ、この環境変数SSHによる接続でない場合は、存在しません。そのため、変数があるかどうかの判定をします。
また、rootの時の表示を変える場合は、環境変数USERにはいっているユーザ名を見て、ユーザ名がrootかどうかにて判定をしています。
尚、上の設定にて接続した場合は、以下のようになります。

ローカルで一般user

[user@hostname]$

ssh越しでroot

[root@hostname]ssh#

こんな時:: ホスト/アカウント別の設定をしてやりたい!

「このマシンはモバイル用だから、こんなコマンドをaliasしておくと便利だよね」とか言いながら.cshrcに書き加えたりしますよね。しかし、これが続いていくと、設定ファイルがカオスなことになります。
そんな時、どのマシンでも共通の.cshrcとは別に、ローカル設定用のファイルと分けた方がよいです。

set LOCALSETTING = ".cshrc_local"
if ( -e $HOME/$LOCALSETTING ) then
	source $HOME/$LOCALSETTING
endif

ホーム以下に.chsrc_localというファイルがあるかどうか判定し、もしあればそれを読み込むようになっています。
この記述を追記してやったのちに、.cshrc_localを置いてやりましょう。

現状私の.cshrc

正月明けにちょこっと弄っていただけなので、まだこの設定は使い込んでいません。もしバグがあったり、「こっちの方が美しい」っていうことがありましたら、教えてください!><
また、ベースの設定はFreeBSD標準の.cshrcとなっています。

set LOCALSETTING = ".cshrc_local"

# OS type - Linux / MacOSX / FreeBSD
if( "$OSTYPE" == "linux" ) then
	# Linux
	alias	ll	"ls -al"
	alias	ls	"ls --color"
	# set binary dir
	if ( -d $HOME/linux ) then
		set LOCALBIN = "linux/bin"
	endif

else if( "$OSTYPE" == "darwin" ) then
	# MacOS X
	# alias
	alias 	ls	"ls -w -F -G"
	alias	ll	"ls -lA"
	#env
	setenv	LSCOLORS	"ExFxCxDxBxegedabagacad"
	# set binary dir
	if ( -d $HOME/mac) then
		set LOCALBIN = "mac/bin"
	else if ( -d $HOME/darwin) then
		set LOCALBIN = "darwin/bin"
	endif

else if( "$OSTYPE" == "FreeBSD" ) then
	# FreeBSD
	# alias
	alias 	ls	"ls -w -F -G"
	alias	ll	"ls -lA"
	setenv	LSCOLORS	"ExFxCxDxBxegedabagacad"
	# set binary dir
	if ( -d $HOME/freebsd) then
		set LOCALBIN = "freebsd/bin"
	endif
endif

# alias
alias rm	"rm -i"
alias cp	"cp -i"
alias view	"vim -R"
alias mv	"mv -i"

# A righteous umask
umask 22

# local binary path
if ( $?LOCALBIN ) then
	set path = ($HOME/bin $HOME/script $HOME/$LOCALBIN /sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin)
else
	set path = ($HOME/bin $HOME/script /sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin)
endif

setenv	EDITOR	vim
setenv	VISUAL	vim
setenv	PAGER	less
setenv	BLOCKSIZE	K
setenv  LANG 'ja_JP.UTF-8'
setenv	LC_ALL 'ja_JP.UTF-8'

# prompt settings
if ($?prompt) then
	# default settngs
	set SSH = ""
	set PRMPT = '$'
	set PRMPTCOLOR = "32" # green

	if ( $?SSH_CLIENT ) then
		set SSH = "ssh"
	endif
	if ( "$USER" == "root" ) then
		set PRMPT = '#'
		set PRMPTCOLOR = "31" # red
	endif
	# set prompt display
	set prompt = "[%{\e[01;$PRMPTCOLOR\m%}$USER@`/bin/hostname -s`%{\e[0m%} %c]%{\e[01;35m%}$SSH%{\e[0m%}$PRMPT "

	set filec
	set history = 100
	set savehist = (1000 merge) # 複数のシェルのヒストリーをマージする
	set mail = (/var/mail/$USER)
	if ( $?tcsh ) then
		bindkey "^W" backward-delete-word
		bindkey -k up history-search-backward
		bindkey -k down history-search-forward
	endif
endif

# load local settings
if ( -e $HOME/$LOCALSETTING ) then
	source $HOME/$LOCALSETTING
endif

# == tcsh options ==
limit coredumpsize 0 # コアファイルを作らない
set autolist # ファイル名を補完
set ignoreeof # [CTRL-D]でログアウトしない
set rmstar # rm *で削除するときに確認する

修正

一部バグを修正