新年の挨拶と、便利なシェル設定(tcsh)
あけましておめでとうございます。毎年のことながら、正月は寝正月をしてしまい、体重が増える一方ですね。
最終人型決戦兵器「牛久大仏」の元を離れ、実家に戻るたびに「この芸人誰?」と思ってしまうわけですが、今年はそもそもテレビを付けないので、そんな思いからは開放されました。
さて、そのテレビを見ていない間にやっていたことの一つとして、Cシェル(tcsh)の設定があります。同じ設定ファイル(.cshrc)を使っていたとしても、linuxやMac、FreeBSDでは色々変わってきてしまいます。どの環境でも問題なく使いまわせる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]$
こんな時:: ホスト/アカウント別の設定をしてやりたい!
「このマシンはモバイル用だから、こんなコマンドを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 *で削除するときに確認する
修正
一部バグを修正