FreeBSD cshrc tips

cshrc tips
作为csh/tcsh的配置文件,常用的包括系统级的/etc/csh.cshrc与用户级的~/.cshrc,后者的优先级高于前者。这里为便于描述,统称cshrc。

1. umask

umask称作用户权限屏蔽位,用于在创建文件或目录时设置默认权限。这里用一些操作来具体说明umask的用法:

> umask                                       # 查看当前umask值
22                                            # 22是csh的默认值
> touch file_umask22 && mkdir dir_umask22/
> ls -lod *_umask22
drwxr-xr-x  2 alphachi  alphachi  – 2 Oct 19 09:51 dir_umask22
-rw-r–r–  1 alphachi  alphachi  – 0 Oct 19 09:51 file_umask22

可以看到,当umask=22时,创建的文件默认权限为rw-r–r–(即644),创建的目录默认权限为rwxr-xr-x(即755)。
在这里,644和755这两个数字是根据“创建默认权限 = 系统默认权限 – umask取值”得出的:
644 = 系统默认权限(文件) – 22
755 = 系统默认权限(目录) – 22
也就是说,文件的系统默认权限为644 + 22 = 666(即rw-rw-rw-),目录的系统默认权限为755 + 22 = 777(即rwxrwxrwx)。这点可以通过将umask设置为0来验证:

> umask 0    # 将umask设置为0
> umask
0
> touch file_umask0 && mkdir dir_umask0/
> ls -lod *_umask0
drwxrwxrwx  2 alphachi  alphachi  – 2 Oct 19 09:52 dir_umask0
-rw-rw-rw-  1 alphachi  alphachi  – 0 Oct 19 09:52 file_umask0

因此可以根据需要在创建文件或目录前临时修改umask取值,例如:

> umask 2
> umask
2
A-desktop > touch file_umask2 && mkdir dir_umask2/
A-desktop > ls -lod *_umask2
drwxrwxr-x  2 alphachi  alphachi  – 2 Oct 19 09:56 dir_umask2     # 775 = 777 – 2
-rw-rw-r–  1 alphachi  alphachi  – 0 Oct 19 09:56 file_umask2    # 664 = 666 – 2

在cshrc中,默认会存在以下配置:

umask 22

需要注意的是,若在cshrc中无此条配置,umask的取值仍然为22,而不是0。

2. PAGER

PAGER是csh/tcsh的常见环境变量,用于设置默认的页面调度程序。以下为cshrc中的默认配置:

setenv PAGER more

将PAGER设置为more的缺点在于:页面输出完毕后若要重新阅读,必须重新调用页面或滚动终端。为了避免这些问题,可以将more更改为功能更为强大的less,即:

setenv PAGER less

与more相比,less的唯一“缺点”在于页面输出完毕后会高亮显示(END)标记,若要退出则需要额外多按一次q键。

3. autorehash

rehash是csh/tcsh的一条内部命令,可以重新计算与环境变量PATH相关的目录的哈希值;在这些目录中添加了新的可执行程序后,往往都需要执行此命令以刷新索引列表,否则系统将无法找到这些程序。
rehash经常在通过Ports安装了新的软件包后使用,例如:
# whereis zsh                          # 这里以通过Ports安装zsh为例
zsh: /usr/ports/shells/zsh
# cd /usr/ports/shells/zsh/
# make BATCH=yes install clean         # BATCH=yes表示使用默认配置编译而跳过编译选项的显示

# zs                                   # 输入zs后按Ctrl+d尝试补全
zstreamdump                            # 没有执行rehash前找不到zsh的相关命令
# rehash
# zs                                   # 再次输入zs后按Ctrl+d尝试补全
zsh         zsh-5.0.0   zstreamdump    # 执行rehash后即可找到相关命令

从版本6.18开始,csh/tcsh引入了新的特殊Shell变量autorehash,用于自动执行rehash操作。若要开启此功能,只需要在cshrc中添加:

set autorehash = always

取值always是指在命令补全和拼写校正时均自动执行rehash操作。若仅需在命令补全时自动执行,可将always更换为complete;若仅需在拼写校正时自动执行,可将always更换为correct。
需要注意的是,默认情况下此功能至少需要在FreeBSD 9.0-STABLE中才能开启,因为之前版本(如9.0-RELEASE)中tcsh的版本均低于6.18。

4. listjobs

listjobs是另一个有用的特殊Shell变量,用于控制任务挂起时的显示方式,以下举例说明:

> set | grep listjobs    # 命令无输出结果表示当前未设置listjobs
> ping www.freebsd.org
PING red.freebsd.org (69.147.83.34): 56 data bytes
64 bytes from 69.147.83.34: icmp_seq=0 ttl=49 time=332.853 ms
^Z                       # 按Ctrl+z挂起
Suspended
> set listjobs           # 仅开启变量listjobs(等于在cshrc中添加配置set listjobs)
> ping www.freebsdchina.org
PING www.freebsdchina.org (222.73.165.29): 56 data bytes
64 bytes from 222.73.165.29: icmp_seq=0 ttl=50 time=73.343 ms
^Z
[1]  – Suspended                     ping www.freebsd.org
[2]  + Suspended                     ping www.freebsdchina.org
> set listjobs = long    # 设置变量listjobs(等于在cshrc中添加配置set listjobs = long)
> ping www.google.com
PING www.google.com (74.125.128.106): 56 data bytes
64 bytes from 74.125.128.106: icmp_seq=1 ttl=45 time=35.502 ms
^Z
[1]    57930 Suspended                     ping www.freebsd.org
[2]  – 57946 Suspended                     ping www.freebsdchina.org
[3]  + 57951 Suspended                     ping www.google.com

可以看到,对于未设置、仅开启、设置变量listjobs这三种情况,任务挂起时的显示信息依次会更加详细。

5. 关于alias

alias为csh/tcsh引入的别名功能非常强大,详见一切皆alias。
虽然alias一般仅出现在cshrc中,但实际上它是csh/tcsh自带的内部命令,因此可以单独使用,例如:
> alias                             # 不使用任何参数则列出所有的别名条目
h       (history 25)
j       (jobs -l)
la      (ls -a)
lf      (ls -FA)
ll      (ls -lA)
> unalias h                         # 删除指定的别名条目
> alias reboot ‘shutdown -r now’    # 添加新的别名条目:
                                    # 在这里系统自带的reboot命令将不再生效,因为alias的优先级更高
j       (jobs -l)
l       (ls -alo)
la      (ls -a)
lf      (ls -FA)
ll      (ls -lA)
reboot  (shutdown -r now)
> \reboot                           # 在命令前添加转义字符\可以忽略alias设置而直接运行原始命令

注意手动输入的alias/unalias仅对当前Shell进程有效,若要始终生效应将其写入cshrc。
无论是采用何种方式配置alias,为防止其可能被Shell曲解,应该为真实命令部分(如上例中的shutdown -r now)的两端添加单引号,若在真实命令部分中存在变量替换,则应将单引号改为双引号。

6. 关于complete

与alias类似,complete也是csh/tcsh自带的内部命令;因此既可以单独使用,也可以写入cshrc。
顾名思义,complete是用于命令补全的,但与普通补全相比其功能更加强大,可以称之为高级补全。
在cshrc中,可以配置以下的普通补全:

if ($?prompt) then            # 仅对交互式Shell生效
    set autolist              # 按下Tab键直接补全
    set complete = enhance    # 补全时忽略大小写,认为-与_相同,将.、-、_作为单词分隔符;
                              # 若将enhance更换为igncase则仅忽略大小写
    set autoexpand            # 补全时参考history命令的输出
endif

配置生效后,将其与complete设置的高级补全进行比较:

> su                                   # 输入su后按Tab键的结果如下
su      sum     suspend                # 注意机器不同可能会出现更多输出
> complete -su* ‘p/0/(su suspend)/’    # 对关键字su设置高级补全:
                                       # -su*表示仅作用于关键字su,例如输入su空格后按Tab键是没有效果的
                                       # p表示作用位置,例如p/0在这里表示作用于su本身
                                       # ()用于限定补全条目,例如这里将补全条目限定于su与suspend
> complete                             # 查看高级补全条目
-su*    ‘p/0/(su suspend)/’
> su                                   # 高级补全下,输入su后按Tab键的结果如下
su      suspend
> uncomplete -su*                      # 删除高级补全条目

可以看到,两者的最大区别在于:在普通补全的基础上,高级补全能够实现更多的条件输出。除此之外,高级补全还能够实现很多普通补全难以实现的补全操作,例如:

> complete man ‘p/*/c/’    # 针对man命令的高级补全:
                           # p表示作用位置,p/*表示对输入的man空格后的任意位置的参数执行补全
                           # c表示补全候选项为当前系统内存在的所有命令
> man a                    # 输入man a后按Tab键的结果如下(此时p/*/c中*为1)
ac          addr2line   amd         ar          at          audit
accton      adduser     amq         arp         atacontrol  auditd
acpiconf    adjkerntz   ancontrol   arpaname    ath3kfw     auditreduce
acpidb      afmtodit    apm         as          atmconfig   authpf
acpidump    alias       apply       asa         atq         awk
addftinfo   alloc       apropos     asf         atrm
> man -w p                 # 输入man -w p后按Tab键的结果如下(此时p/*/c中*为2)
pac           pfbtops       pkg_info      powerd        ps
pagesize      pfctl         pkg_updating  poweroff      psroff
passwd        pflogd        pkg_version   ppp           pstat
paste         pftp          pkill         pppctl        purgestat
patch         pgrep         pmcannotate   pr            pushd
pathchk       pic           pmccontrol    praliases     pw
pawd          ping          pmcstat       praudit       pwait
pax           ping6         popd          pre-grohtml   pwd
pc-sysinstall pkg_add       portaudit     printenv      pwd_mkdb
pciconf       pkg_cleanup   portmaster    printf
periodic      pkg_create    portsnap      procctl
perror        pkg_delete    post-grohtml  procstat

再看一个非常实用的高级补全范例:在csh/tcsh中快速ssh到已保存主机。
1)创建或编辑~/.ssh/config,此文件可以为多个SSH主机保存不同的配置参数(详见man ssh_config):

Host firewall
    HostName     192.168.0.1     # 主机地址
    User         froot           # 登录用户名
    Port         50000           # 连接端口
    IdentityFile ~/.ssh/id/fw    # 调用的私钥文件
    Compression  yes             # 开启压缩
Host router
    HostName            192.168.10.1
    User                root
    Port                51000
    IdentityFile        ~/.ssh/id/router
    ServerAliveInterval 60       # 每60秒发送一次alive包以防止空闲掉线
Host switch
    HostName 192.168.100.1
    User     admin
    Port     54321

2)在cshrc中添加以下内容:

if (-e ~/.ssh/config) then     # 若~/.ssh/config存在则执行以下命令:
                               # 变量sshlist为由~/.ssh/config获取并格式化的主机列表
                               # p/1/($sshlist)将ssh空格后的第一个参数的补全内容限制在($sshlist)中
    set sshlist = `grep Host\  ~/.ssh/config | cut -d \  -f 2`
    complete ssh "p/1/($sshlist)/"
endif

3)通过source cshrc命令使编辑后的cshrc即时生效,然后查看补全效果:

> ssh                       # 输入ssh空格后按Tab键的结果如下
firewall router   switch    # 选择所需补全即可开始连接至对应主机
                            # 若在~/.ssh/config中添加了新的主机,也需要通过source cshrc命令即时生效

当然,complete命令的功能远不止于此,详见man tcsh中REFERENCE > Builtin command > complete一节。
注意与alias相同,手动输入的complete/uncomplete仅对当前Shell进程有效,若要始终生效应将其写入cshrc,此外引号的使用规则也是一样的。

7. 快捷键绑定

csh/tcsh中的快捷键设置实际上也是通过内部命令实现的,例如:

> bindkey -a    # 列出已绑定的快捷键("^"表示Ctrl,"^["表示Alt)
> bindkey -v    # 按照vi方式绑定快捷键
> bindkey -e    # 按照emacs方式绑定快捷键
> bindkey -h    # 显示所有帮助信息

与所有内部命令相同,bindkey既可以手动配置也可以写入cshrc中。
在控制台下,若需使用左Alt作为快捷键前缀,除了根据bindkey命令配置外,还应执行以下操作:
1)编辑/usr/share/syscons/keymaps/us.iso.kbd,将056行的首个lalt修改为meta;
2)执行kbdcontrol -l us.iso.kbd,也可在/etc/rc.conf中添加keymap=“us.iso.kbd”以使其永久生效。
注意此设置会带来一些“副作用”,例如无法再通过左Alt配合F功能键切换控制台,不过可以使用Ctrl+左Alt或右Alt替代。
8. 个性化提示符

提示符一节中已经对此做了详细的描述,这里仅说明如何针对X与控制台设置不同的提示符。
在cshrc中添加以下内容:

if ($?prompt) then
    if ($?DISPLAY) then    # 针对X:
                           # 特殊字符串%{\e]0;加\a%}的组合可以将两者中间的字符发送至终端模拟器
                           # 其他的%相关含义详见man tcsh中REFERENCE > Special shell variables > prompt一节
        set prompt = "%{\e]0;%l = %~\a%}%B%m %# %b"
    else                   # 针对控制台
        set prompt = "%B%m:%l%b %~ %B%# %b"
    endif
endif

以上设置生效后,在X下类似于XTerm的终端模拟器里,csh/tcsh的提示符中被发送的字符会显示于窗口标题栏,而在控制台下则会全部显示。

附:更多的cshrc范例

在Ports中提供了一个关于cshrc的包,位于/usr/ports/shells/tcshrc;安装之后,可以学到一些更高级的配置写法。

原文链接:https://wiki.freebsdchina.org/doc/c/cshrc_tips

配置你的csh/tcsh

选择 csh/tcsh

和许多刚从 Linux 转到 BSD 的人不同,我并没有装完 BSD 就顺手安装 bash,
因为之前除了打命令,我没有用到额外的功能,bash 也好,csh 也罢,在我眼里都是当做 shell 来用。
但是渐渐地,我发现 csh 真的挺好用,它小巧、简单、开放,不需要额外依赖。
可能有人要拿脚本能力来作对比,比如bash脚本支持函数,csh不支持等。
对我来说,其实我从未像模像样地写过一个脚本,我的工作是 C++ 程序员。
从我的角度来看,
论脚本能力,其实bash、csh、zsh都比不上Python,
论兼容性,bash、csh、zsh都比不上sh,
论强大,bash、csh、zsh都比不上C/C++,甚至asm。
再看易学程度,bash、csh、zsh可能还是要输给Python。
综上,脚本能力忽略不计。
好了,说了这么多大不敬的话,我们开始切入正题。

配置文件

全局配置文件 /etc/csh.cshrc
个人配置文件 ~/.cshrc或~/.tcshrc
为了方便,建议修改全局性的配置文件,这样每个账号都可以享受便利。
按键绑定

通常,我们不设置按键绑定也能很好地工作,
但是对于远程登录,可能需要一些额外的配置。
比如,为了避免putty登录后,Home、End、Delete等变成~,你需要如下配置:
bindkey ‘\e[1~’ beginning-of-line      # Home
bindkey ‘\e[3~’ delete-char            # Delete
bindkey ‘\e[4~’ end-of-line            # End
bindkey “^W” backward-delete-word      # Delete
bindkey -k up history-search-backward  # PageUp
bindkey -k down history-search-forward # PageDown
提示符

设置一个漂亮使用的的提示符可以让工作变得更愉快高效。
以下是一个合理的配置方案:
if ( $?prompt ) then                                #如果$prompt变量尚未设置,则做如下设置
if ( “$uid” == “0” ) then                      #判断用户的uid
set prompt = “%U%n%u@%m [%l] %B%~%b # ”    #对于root,我们显示“#”号
else
set prompt = “%U%n%u@%m [%l] %B%~%b % ”    #对于普通用户,显示“%”号。
endif
endif
Konsole中的效果如下:

一种彩色的配置方案如下:
set cr = “%{\e[31m%}” #开始红色
set cg = “%{\e[32m%}” #开始绿色
set c0 = “%{\e[0m%}”  #恢复为默认色彩

# Set some variables for interactive shells
if ( $?prompt ) then
if ( “$uid” == “0” ) then
set prompt = “%B%U%n%u@%m.$cr%l$c0%b %c2 %B%#%b ”
else
set prompt = “%B%U%n%u@%m.$cg%l$c0%b %c2 %B%%%b ”
endif
endif
Konsole中的效果如下:

颜色代码:
1 for brighter colors
4 for underlined text
5 for flashing text
30 for black foreground
31 for red foreground
32 for green foreground
33 for yellow (or brown) foreground
34 for blue foreground
35 for purple foreground
36 for cyan foreground
37 for white (or gray) foreground
40 for black background
41 for red background
42 for green background
43 for yellow (or brown) background
44 for blue background
45 for purple background
46 for cyan background
47 for white (or gray) background
查看更多参数,及其作用:
man tcsh  #查看man手册
/%/       #搜索到“%/”开始的地方
环境变量等

你在抱怨 FreeBSD下的 ls 没有显示颜色, grep 出来的东西没有高亮吗? 那么你需要如下的配置:
#让 ls 鲜艳些
setenv LSCOLORS ExGxFxdxCxegedabagExEx
setenv CLICOLOR yes
#让 grep 匹配到的字符高亮
setenv GREP_OPTIONS –color=auto
对于在KDE下使用fcitx的人,需要如下三行设置,
其实就是fcitx安装完后所提示的内容,如果你够细心的话。
setenv XMODIFIERS @im=fcitx
setenv QT_IM_MODULE xim
setenv GTK_IM_MODULE xim
嗯, ls 有颜色了,但是等等,为何 tab 不能补全?
你需要如下配置:
set autolist
如果命令输错了,让csh/tcsh 为你纠正:
set correct = cmd
为了在命令行启动某个游戏,或者kde程序,例如dolphin、kcalc,
你需要加两个路径到$path中去:
/usr/games /usr/local/kde4/bin/

set path = (/sbin /bin /usr/sbin /usr/local/bin /usr/games /usr/local/sbin /usr/bin $HOME/bin /usr/local/kde4/bin/)
黑魔法防御术

重定向防御

重定向很强大,我们有时候会运行诸如“date » b.txt”,“ls -l > files.txt”等命令。
然而如果一不小心,把“»”输成“>”会造成什么后果呢?
为此,tcsh提供了noclobber这个选项:
set noclobber
有了它,悲剧就不会发生。如果“>”的目标文件已存在,tcsh会拒绝重定向。
覆盖防御

是否遇到过“mv a b”,从而把有用的b文件覆盖掉了?
为此,我们要让mv和cp的行为更谨慎:
alias mv ‘mv -i’
alias cp ‘cp -i’
如果目标文件已存在,mv和cp会拒绝操作,除非使用参数“-f”。
误删防御

rm这个命令自从诞生起,就一直是个危险的操作。
我们可以让rm更温和:
alias rm ‘rm -i’
这样rm之前,会要求再次确认。
一切皆alias

前面,我们在黑魔法防御术中已经初步见识了alias。
alias不仅可以避免危险操作,还可以简化命令,自创命令。
除非极短,否则良好的alias命名,应当以某个统一的单词或字母开头,
例如下面即将展示的reload/edit系列、update系列、show系列等。
先展示最基本的alias,并逐条解释。
alias ..    ‘cd ..’       #两点即可回到上级目录
alias –        ‘cd -‘        #一杠返回上次的目录
alias q        ‘exit’        #退出登录
alias rm    ‘rm -i’       #误删防御
alias del   ‘rm -r’       #删除整个目录
alias mv    ‘mv -i’       #覆盖防御
alias cp    ‘cp -i’       #覆盖防御
alias ls    ‘ls -I’       #root状态下,默认不显示隐藏文件(.*)。BSD的ls很特殊,root默认显示所有文件。
alias la    ‘ls -a’       #显示所有文件
alias ll    ‘ls -h -l’    #显示文件权限和大小(以合理的单位)
alias lr    ‘ls -R’       #递归显示目录
alias dh    ‘df -h -a -T’ #以合适的单位显示所有磁盘的剩余空间,以及文件系统类型(如ufs、devfs、procfs)。
alias ds    ‘du -sh’      #以合适的单位显示查看每个文件/文件夹的大小
find/wc系列。快速查找当前目录下的所有c/cxx/python源码文件。结合wc可以统计行数。
alias find-c    ‘find . -name “*.h” -o -name “*.c”‘
alias find-x    ‘find . -name “*.h” -o -name “*.hpp” -o -name “*.cpp” -o -name “*.cxx”‘
alias find-py    ‘find . -name “.py”‘
alias wc-c    ‘find . -name “*.h” -o -name “*.c” | xargs wc | sort -k 4’
alias wc-x    ‘find . -name “*.h” -o -name “*.hpp” -o -name “*.cpp” -o -name “*.cxx” | xargs wc | sort -k 4’
alias wc-py    ‘find . -name “.py” | xargs wc | sort -k 4’
reload/edit系列。实现快速修改,载入配置文件。
alias reload-rc.conf  ‘sh /etc/rc’
alias reload-cshrc    ‘unalias * && source /etc/csh.cshrc’
alias edit-xorg.conf  ‘vim /etc/xorg.conf’
alias edit-csh.cshrc  ‘vim /etc/csh.cshrc’
alias edit-make.conf  ‘vim /etc/make.conf’
alias edit-kern.conf  ‘vim /etc/kernconf/thinkpad’
alias edit-rc.conf    ‘vim /etc/rc.conf’
alias edit-vimrc      ‘vim /usr/local/share/vim/vimrc’
set系列。快速设置locale。

alias setlocale-zhcn ‘setenv LC_ALL zh_CN.UTF-8 && setenv LANG zh_CN.UTF-8’
alias setlocale-c    ‘setenv LC_ALL C’
startx专用。
保持命令行下为英文locale(避免date等命令出现乱码),而让x环境为中文,适合手动startx而不是kdm的人。

alias sx ‘setenv LC_ALL zh_CN.UTF-8 && setenv LANG zh_CN.UTF-8 && startx && setenv LC_ALL C’
make系列。快速编译kernel/world。

alias make-world  ‘cd /usr/src && make buildworld && cd -‘
alias make-kernel ‘cd /usr/src && make kernel KERNCONF=thinkpad && cd -‘
alias make-installworld ‘cd /usr/src && make installworld && make delete-old && cd -‘
show系列。查看状态或某些信息。

alias show-ifstat    ‘systat -ifstat’    #查看网络接口的数据流量
alias show-geom        ‘gstat’             #查看I/O状态
alias show-thermal    ‘sysctl dev.acpi_ibm.0.thermal’  #查看ThinkPad笔记本的各部分温度
alias show-cpufreq    ‘sysctl dev.cpu.0.freq’          #查看当前cpu频率
alias show-cpulevels    ‘sysctl dev.cpu.0.freq_levels’   #查看可用的cpu频率
alias show-battery    ‘sysctl hw.acpi.battery.life && sysctl hw.acpi.battery.time’ #查看电力
alias show-smartctl    ‘smartctl -a /dev/ad4’           #需要安装smartmontools,查看磁盘smart参数
alias show-alldep    ‘make all-depends-list’            #需要在ports的安装目录下执行,显示所有依赖
alias show-dep        ‘portmaster –show-work ./ | sort’ #同上,且需要安装portmaster,只显示尚未安装的依赖
alias show-ver        ‘pkg_version -v’                   #查看是否有软件可更新
update系列。顾名思义,更新嘛。
alias update-locatedb    ‘/usr/libexec/locate.updatedb’            #更新locate数据库
alias update-kernsrc     ‘csup -L 2 /etc/supfiles/stable-supfile’  #同步kernel tree
alias update-ports       ‘portsnap fetch update’                   #同步ports tree
alias update-apps     ‘portmaster -a –force-config’            #需要安装portmaster,更新所有软件,提示配置选项
杂项,均需要安装第三方软件才能用。

alias lt    ‘tree -N -C’       #需要安装tree。树状显示目录,-N可以保证中文显示,-C使用彩色
alias l3    ‘tree -N -C -L 3’  #目录最多递归三级
alias l4    ‘tree -N -C -L 4’  #四级
alias l5    ‘tree -N -C -L 5’  #五级
alias l6    ‘tree -N -C -L 6’  #六级
alias v        ‘vim’              #不用说,我懒
alias m     ‘mocp’             #控制台下的cs架构播放器
alias getdir    ‘wget -c -r -np -k’                  #递归下载目录
alias ssh-home    ‘ssh raphael.vicp.cc -l root’        #用root账号登录,结合key可以免输密码
alias ftp-home   ‘ftp ftp://syh:syh@raphael.vicp.cc’ #BSD自带的ftp,免输账号密码。主机已被电信和工信部和谐,勿再试
alias lft-phome    ‘lftp raphael.vicp.cc -u syh,syh’    #lftp的免输账号密码。
alias scons    ‘scons -Q -j 4’                      #构建工具,默认4个线程进行
alias valgrind-checkmem ‘valgrind –tool=memcheck –leak-check=full’  #检查内存泄漏
最好的教材

最好的教材莫过于man手册,真的什么都有了。

man tcsh

原文链接:http://wiki.freebsdchina.org/howto/c/config_your_csh