C Shell
2022-04-25 13:57:14 阿炯

C shell(csh)是Unix Shell的一种,由比尔·乔伊(Bill Joy)在BSD系统上开发。它脱胎于Unix第六版的/bin/sh,也是Bourne shell的前身。其语法类似于C语言,与Bourne shell相比有不少特别的功能,比如aliases(别名)、command history(命令的历史)。目前C shell已不再被广泛使用,后继者包括Tenex C shell(tcsh)、Korn shell(ksh)、GNU Bourne-Again shell(bash)。采用C语言开发并在BSD协议下授权。


C shell在交互模式中引入许多开创性功能的同时,其脚本执行能力受到了不少批评。无论如何,由于在所有的单一UNIX规范兼容系统中都放了标准的Bourne shell,所以大部分人都建议使用sh来进行脚本编写。

shell是一个用C语言编写的程序,它是用户与操作系统沟通的桥梁。shell既是一种命令语言,又是一种程序设计语言,shell还是一种应用程序,这个程序提供一个界面,用户可以通过这个界面访问或操纵操作系统。常见的Shell有sh、bash、csh、tcsh、ash、zsh等。

tcsh是一个向下兼容c shell的Unix shell。它本质上是为c shell增加命令补完,命令编辑等其他功能。目前作为FreeBSD和其延伸发行版的默认shell。 其最新版本为6.22,于2020年11月18日发布,官方网站:www.tcsh.org。

Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。

BSD 是 UNIX 的一个重要分支,在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。

sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。它是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

特点展示

1)、设置命令补全,修改/etc/csh.cshrc文件:
set autolist

2)、显示类似 [zheng@freeoa /usr/local/etc]# 这样的提示符,修改/etc/csh.cshrc文件:
set prompt = '[%B%n@%m%b %B%~%b%] #'

3)、让ls命令显示目录的时候带/斜杠区分普通文件,修改/etc/csh.cshrc文件:
alias ls ls -F

4)、让 csh 具有历史命令编辑功能,还是/etc/csh.cshrc文件:
bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward

5)、最后可使用script命令替代nohup命令:
script -a script.log "command"

6)、其它
umask称作用户权限屏蔽位,用于在创建文件或目录时设置默认权限,在cshrc中,默认会存在以下配置:umask 22。

rehash是csh/tcsh的一条内部命令,可以重新计算与环境变量PATH相关的目录的哈希值;在这些目录中添加了新的可执行程序后,往往都需要执行此命令以刷新索引列表,否则系统将无法找到这些程序。它经常在通过Ports安装了新的软件包后使用。

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

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

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

listjobs是另一个有用的特殊Shell变量,用于控制任务挂起时的显示方式。


FreeBSD 下 Csh(Tcsh) 用户配置文件的运行顺序

首先系统默认的配置文件有:
1./etc/csh.cshrc
2./etc/csh.login
3./etc/csh.logout
4.~/.cshrc
5.~/.login
6.~/.logout

当作为登录 Shell 时,如:用户登录系统(Login-Shell),配置文件的运行顺序为:
1./etc/csh.cshrc
2./etc/csh.login
3.~/.cshrc
4.~/.login

当用户退出时,配置文件运行顺序为:
1./etc/csh.logout
2.~/.logout

当 作为非登录Shell时,如:运行Shell脚本文件(也称为Sub-Shell),配置文件的运行顺序为:
1./etc/csh.cshrc
2.~/.cshrc

这时只运行cshrc脚本,而不再运行login脚本。当结束Sub-Shell时,配置文件运行顺序为:
1./etc/csh.logout
2.~/.logout

无论是通过logout,exit命令进行登录,还是直接运行reboot,halt命令重启或关闭机器,或者通过远程如SSH登录后直接关掉会话,csh都会执行logout的脚本。

由于历史原因,较早版本的 FreeBSD root 用户的home在/,所以现在还保留着/下的用户Shell配置文件。配置文件都以硬连接的方式存在的。

FreeBSD下关于csh/tcsh Shell变量

csh导出变量命令列表
env或env | grep var_name设置环境并执行命令,或打印环境变量
setenv name value将环境变量名称设置为value并导出
echo" $var_name"或printf"%FORMAT" $var_name显示环境变量名称的值

显示当前环境变量
在tcsh或csh中查看环境变量的当前名称和值:
setenv

导出shell变量
导出并设置新的环境变量:
setenv name value
setenv EDITOR /usr/bin/vim

csh环境变量配置文件是~/.cshrc文件:
alias h    history 25
alias j    jobs -l
alias la    ls -a
alias lf    ls -FA
alias ll    ls -lA
 
# A righteous umask
umask 22
 
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)
 
setenv  EDITOR  vim
setenv  PAGER   less
setenv  BLOCKSIZE    M
 
if ($?prompt) then
    # An interactive shell -- set some stuff up
    set prompt = "`/bin/hostname -s`# "
    set filec
    set history = 100
    set savehist = 100
    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

常用的tcsh环境变量

BLOCKSIZE:几个命令使用的块单位的大小,最著名的是df,du和ls。BLOCKSIZE可以通过指定数字以字节为单位指定,通过指定数字后跟K或k以千字节为单位指定,通过指定数字后跟M或m等以兆字节为单位指定。
COLUMNS:用户在终端的列位置上首选的宽度。诸如ls之类的实用程序以及使用它来将输出格式化为列的实用程序。
EDITOR:默认的编辑器名称。
EXINIT:ex和vi读取的命令的启动列表。
HOME:用户登录目录,通过从密码文件/etc/passwd登录设置。
LANG:该变量将所有使用setlocale的程序配置为使用指定的语言环境,除非设置了LC_ *变量。
MAIL:用户邮箱的位置,而不是/var/mail中的默认邮箱,由mail,sh和许多其他邮件客户端使用。
PAGER:默认的分页程序。 mail,man,ftp等使用此变量指定的程序来显示比当前显示更长的信息。
PATH:查找可执行文件时,目录顺序,以冒号分隔,由csh,sh,system,execvp等搜索。最初通过登录将PATH设置为/usr/bin:/bin。
PRINTER:lpr,lpq和lprm使用的默认打印机的名称。
PWD:当前目录路径名。
SHELL:用户登录shell的完整路径名。
TERM:要为其准备输出的终端的种类。此信息由可能利用特殊终端功能的命令(例如nroff或plot)使用。
TMPDIR:用于存储临时文件的目录。大多数应用程序使用/tmp或var/tmp。设置此变量将使他们使用另一个目录。
TZ:显示日期时使用的时区。
USER:用户的登录名。

导出变量

定义csh变量
setenv pi 3.141

使用printf命令/echo命令查看csh变量的值:
echo "$pi"
printf "%d\n" $pi

新建一个tcsh子会话:
tcsh

在子会话中查看是否继承了父会话中的环境变量:
env | grep pi
echo "$pi"

Shell是一个程序,一般都是放在/bin或者/user/bin目录下,当前操作系统可用的shell都记录在/etc/shells文件中。/etc/shells是一个纯文本文件。

参考:
tcsh shell编程入门


最新版本:6.18.00
于2012年1月14日发布。

项目主页:http://bxr.su/NetBSD/bin/csh/