用户工具

站点工具


doc:c:cshrc_tips

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
doc:c:cshrc_tips [2012/11/25 19:34]
delphij [cshrc Tips]
doc:c:cshrc_tips [2012/11/25 23:46] (当前版本)
alphachi [6. 关于complete]
行 1: 行 1:
 +====== cshrc tips ====== 
 +作为csh/​tcsh的配置文件,常用的包括系统级的/​etc/​csh.cshrc与用户级的~/​.cshrc,后者的优先级高于前者。这里为便于描述,统称cshrc。 
 +===== 1. umask ===== 
 +umask称作用户权限屏蔽位,用于在创建文件或目录时设置默认权限。这里用一些操作来具体说明umask的用法: 
 +<​code>​ 
 +> 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 
 +</​code>​ 
 +可以看到,当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来验证: 
 +<​code>​ 
 +> umask 0    # 将umask设置为0 
 +> umask 
 +
 +> 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 
 +</​code>​ 
 +因此可以根据需要在创建文件或目录前临时修改umask取值,例如: 
 +<​code>​ 
 +> umask 2 
 +> umask 
 +
 +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 
 +</​code>​ 
 +在cshrc中,默认会存在以下配置: 
 +<​code>​ 
 +umask 22 
 +</​code>​ 
 +需要注意的是,若在cshrc中无此条配置,umask的取值仍然为22,而不是0。 
 +===== 2. PAGER ===== 
 +PAGER是csh/​tcsh的常见环境变量,用于设置默认的页面调度程序。以下为cshrc中的默认配置: 
 +<​code>​ 
 +setenv PAGER more 
 +</​code>​ 
 +将PAGER设置为more的缺点在于:页面输出完毕后若要重新阅读,必须重新调用页面或滚动终端。为了避免这些问题,可以将more更改为功能更为强大的less,即: 
 +<​code>​ 
 +setenv PAGER less 
 +</​code>​ 
 +与more相比,less的唯一“缺点”在于页面输出完毕后会高亮显示(END)标记,若要退出则需要额外多按一次q键。 
 +===== 3. autorehash ===== 
 +rehash是csh/​tcsh的一条内部命令,可以重新计算与环境变量PATH相关的目录的哈希值;在这些目录中添加了新的可执行程序后,往往都需要执行此命令以刷新索引列表,否则系统将无法找到这些程序。\\ 
 +rehash经常在通过Ports安装了新的软件包后使用,例如:\\ 
 +<​code>​ 
 +# 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后即可找到相关命令 
 +</​code>​ 
 +从版本6.18开始,csh/​tcsh引入了新的特殊Shell变量autorehash,用于自动执行rehash操作。若要开启此功能,只需要在cshrc中添加: 
 +<​code>​ 
 +set autorehash = always 
 +</​code>​ 
 +取值always是指在命令补全和拼写校正时均自动执行rehash操作。若仅需在命令补全时自动执行,可将always更换为complete;若仅需在拼写校正时自动执行,可将always更换为correct。\\ 
 +需要注意的是,默认情况下此功能至少需要在FreeBSD 9.0-STABLE中才能开启,因为之前版本(如9.0-RELEASE)中tcsh的版本均低于6.18。 
 +===== 4. listjobs ===== 
 +listjobs是另一个有用的特殊Shell变量,用于控制任务挂起时的显示方式,以下举例说明: 
 +<​code>​ 
 +> 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 
 +</​code>​ 
 +可以看到,对于未设置、仅开启、设置变量listjobs这三种情况,任务挂起时的显示信息依次会更加详细。 
 +===== 5. 关于alias ===== 
 +alias为csh/​tcsh引入的别名功能非常强大,详见[[howto:​c:​config_your_csh#​一切皆alias|]]。\\ 
 +虽然alias一般仅出现在cshrc中,但实际上它是csh/​tcsh自带的内部命令,因此可以单独使用,例如:\\ 
 +<​code>​ 
 +> 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设置而直接运行原始命令 
 +</​code>​ 
 +注意手动输入的alias/​unalias仅对当前Shell进程有效,若要始终生效应将其写入cshrc。\\ 
 +无论是采用何种方式配置alias,为防止其可能被Shell曲解,应该为真实命令部分(如上例中的shutdown -r now)的两端添加单引号,若在真实命令部分中存在变量替换,则应将单引号改为双引号。 
 +===== 6. 关于complete ===== 
 +与alias类似,complete也是csh/​tcsh自带的内部命令;因此既可以单独使用,也可以写入cshrc。\\ 
 +顾名思义,complete是用于命令补全的,但与普通补全相比其功能更加强大,可以称之为高级补全。\\ 
 +在cshrc中,可以配置以下的普通补全: 
 +<​code>​ 
 +if ($?prompt) then            # 仅对交互式Shell生效 
 +    set autolist ​             # 按下Tab键直接补全 
 +    set complete = enhance ​   # 补全时忽略大小写,认为-与_相同,将.、-、_作为单词分隔符; 
 +                              # 若将enhance更换为igncase则仅忽略大小写 
 +    set autoexpand ​           # 补全时参考history命令的输出 
 +endif 
 +</​code>​ 
 +配置生效后,将其与complete设置的高级补全进行比较: 
 +<​code>​ 
 +> 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*                      # 删除高级补全条目 
 +</​code>​ 
 +可以看到,两者的最大区别在于:在普通补全的基础上,高级补全能够实现更多的条件输出。除此之外,高级补全还能够实现很多普通补全难以实现的补全操作,例如: 
 +<​code>​ 
 +> 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 
 +</​code>​ 
 +再看一个非常实用的高级补全范例:在csh/​tcsh中快速ssh到已保存主机。\\ 
 +1)创建或编辑~/​.ssh/​config,此文件可以为多个SSH主机保存不同的配置参数(详见man ssh_config): 
 +<​code>​ 
 +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 
 +</​code>​ 
 +2)在cshrc中添加以下内容: 
 +<​code>​ 
 +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 
 +</​code>​ 
 +3)通过source cshrc命令使编辑后的cshrc即时生效,然后查看补全效果: 
 +<​code>​ 
 +> ssh                       # 输入ssh空格后按Tab键的结果如下 
 +firewall router ​  ​switch ​   # 选择所需补全即可开始连接至对应主机 
 +                            # 若在~/​.ssh/​config中添加了新的主机,也需要通过source cshrc命令即时生效 
 +</​code>​ 
 +当然,complete命令的功能远不止于此,详见man tcsh中REFERENCE > Builtin command > complete一节。\\ 
 +注意与alias相同,手动输入的complete/​uncomplete仅对当前Shell进程有效,若要始终生效应将其写入cshrc,此外引号的使用规则也是一样的。 
 +===== 7. 快捷键绑定 ===== 
 +csh/​tcsh中的快捷键设置实际上也是通过内部命令实现的,例如: 
 +<​code>​ 
 +> bindkey -a    # 列出已绑定的快捷键("​^"​表示Ctrl,"​^["​表示Alt) 
 +> bindkey -v    # 按照vi方式绑定快捷键 
 +> bindkey -e    # 按照emacs方式绑定快捷键 
 +> bindkey -h    # 显示所有帮助信息 
 +</​code>​ 
 +与所有内部命令相同,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. 个性化提示符 ===== 
 +[[howto:​c:​config_your_csh#​提示符|]]一节中已经对此做了详细的描述,这里仅说明如何针对X与控制台设置不同的提示符。\\ 
 +在cshrc中添加以下内容: 
 +<​code>​ 
 +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 
 +</​code>​ 
 +以上设置生效后,在X下类似于XTerm的终端模拟器里,csh/​tcsh的提示符中被发送的字符会显示于窗口标题栏,而在控制台下则会全部显示。 
 +===== 附:更多的cshrc范例 ===== 
 +在Ports中提供了一个关于cshrc的包,位于/​usr/​ports/​shells/​tcshrc;安装之后,可以学到一些更高级的配置写法。
/data/vhosts/wiki-data/pages/doc/c/cshrc_tips.txt · 最后更改: 2012/11/25 23:46 由 alphachi