【FreeBSD】tcsh設定ファイルの実行順序と設定例

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p7
tcsh tcsh 6.20.00

はじめに

FreeBSD標準シェルのtcsh

標準エラーのリダイレクトの扱いはちょっと困るけど、
デフォルトでもそこそこ補完してくれて、使い勝手はそんなに悪くないと思う。

ただ、~/.cshrcに少し設定を追加すれば、少し幸せになれるかもしれない。

ここでは、僕がちょっとハマったことや、ちょっと便利なショートカットキーの指定方法をご紹介。

  1. 設定ファイルと実行順序
    • ログイン時
    • 通常シェル起動時
    • ログアウト時
  2. ~/.cshrcの設定例

設定ファイルと実行順序

まずは、把握しておきたい設定スクリプトの種類と実行順序について。

ログイン時
順番 ファイル 備考
1 /etc/csh.cshrc
2 /etc/csh.login ログイン時のみ実行
3 ~/.tcshrc tcshでのみ使用
4 ~/.cshrc ~/.tcshrcがあると実行しない
5 ~/.history savehistが設定されている場合、コマンド履歴をメモリにロードするっぽい
6 ~/.login ログイン時のみ実行
7 ~/.cshdirs savedirsが設定されている場合、ディレクトリスタックを読み込むためのファイルっぽいけど、イマイチ利用価値が分からない
通常シェル起動時
順番 ファイル 備考
1 /etc/csh.cshrc
2 ~/.tcshrc
3 ~/.cshrc ~/.tcshrcがあると実行しない
4 ~/.cshdirs tcsh -dをつけたときのみ
ログアウト時
順番 ファイル 備考
1 /etc/csh.logout
2 ~.logout 中身はclearとか書いておくといいと思う

なお、FreeBSDcshtcshへのハードリンクっぽい。

~/.cshrcの設定

特に理由がなければ、設定は~/.tcshrcではなく~/.cshrcに書けばいいと思う。
FreeBSDでサンプル(/usr/share/skel配下)が用意されているのも~/.cshrcっぽいので。

パス

実行ファイルを探すディレクトリを指定する環境変数PATH

~/.cshrc内でpath変数に設定すると、PATHにも反映してくれる。

サンプルに従って空白区切りでディレクトリを追記すればOK。

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/.cargo/bin $GOPATH/bin)  

以下のように設定しちゃうと、~/.cshrcを読み込む度に$HOME/binが末尾に追加されていってしまうので注意。

set path = ($path $HOME/bin)  

エイリアスの引数

コマンドの別名を手軽に設定できるエイリアス機能。

エイリアス定義時に、引数を明記しない場合は末尾に展開される。

でも、途中に引数を渡したいときもある。
そんなときは、'\!*'や、'\!:1'などで指定できる。
シングルクォーテーションで囲む点に注意。

# e hello world ==> echo hello world  
alias e  echo

# w grep sed | file -f -  ==> which grep | file -f -  
alias w  'which \!:1 | file -f -'

 # wa grep sed | file -f -  ==> which grep sed | file -f -  
alias wa  'which \!* | file -f -'

ちなみに、コマンド名の前に\を入れると、そのときだけエイリアスを無効化できるよ。

> \ls

ショートカットキー

他のシェル同様、ショートカットキーを設定できる。

以下が設定例。
サンプルに追記する感じでよろしいかと。
(up/downはサンプルから変えてるよ)

if ( $?tcsh ) then  
    bindkey -s "^[u" "^Ucd ..\n"            # 上のディレクトリへ移動  
    bindkey -s "^[z" "^Ucd -\n"             # 直前のディレクトリへ移動  
    bindkey -s "^[g" "^E | grep "           # 入力コマンドの末尾に" | grep " を追加  
    bindkey -s "^[m" "^Aman ^E\n"           # 入力コマンドのmanを開く  
    bindkey -k up up-history                # 全履歴を古い方に向かって辿っていく(新⇒古)  
    bindkey -k down down-history            # コマンド履歴を辿っていく(古⇒新)
    bindkey "^P" history-search-backward    # 入力文字列から始まるコマンド履歴を辿っていく(新⇒古)
    bindkey "^N" history-search-forward     # 入力文字列から始まるコマンド履歴を辿っていく(古⇒新)
endif  

キーの表現例は以下。

表記 意味
^[u Alt+uキーかEsc uを指す
^p Ctrl+Pキーを指す。大文字・小文字の区別は無さ気

bindkeyのオプションは以下。 他はbindkey -uで確認してね。

オプション 意味
-k 矢印キーを指定する際に必要っぽい
-r ショートカットキー削除
-s 文字列を出力する際に必要っぽい
-v シェルがviライクのキーバインドに!!

ちなみに現在設定されているショートカットキーも、bindkeyで確認できる。

> bindkey ^@  
"^@"    ->      set-mark-command  

> bindkey  
Standard key bindings  
"^@"           ->  set-mark-command  
"^A"           ->  beginning-of-line  
"^B"           ->  backward-char  
"^C"           ->  tty-sigintr  
  .  
  .  
  .  

最後に

僕は使っていないのだけれども、tcshの補完機能はカスタマイズできるっぽい。

物足りない人は下記ページなどを参考に、completeコマンドについて調べてみるといいかも。

また、Cシェルについての情報は、以下のサイトさんが詳しそう。
ちょっと古いけどしっかりまとめられてて、とてもありがたい。

参考

以上。