|
 
- 发帖数
- 174
- 在线时间
- 31 小时

|
楼主
发表于 2010-3-12 15:17
| 只看该作者
C shell
C shell
本章介绍C shell,之所以如此命名,是因为它很多的编程结构与符号和C 编程语言
相似。其中包括以下内容:
● 功能概述
● 语法
● 变量
● 表达式
● 命令历史
● 作业控制
● 调用shell
● 内置的C shell 命令
要想得到有关C shell 的更多信息,可以阅读在参考文献中列出的《Using csh &tcsh》。
功能概述
C shell 具备以下功能:
● 输入输出重定向
● 用于文件名缩写的通配符(元字符)
● 定制用户环境的shell 变量
● 整数运算
● 访问以前的命令(命令历史)
● 命令名缩写(别名)
● 用于写shell 程序的内置命令集
● 作业控制
● 文件名完成(可选)
语法
本部分介绍了针对C shell 的很多符号。包括以下内容:
● 特殊文件
● 文件名元字符
● 引用
● 命令方式
● 重定向方式
特殊文件
~/.cshrc 在shell 调用每一个实例时执行。
~/.login 在.cshrc 执行之后由登录shell 执行。
~/.logout 在退出时由登录shell 执行
~/.history 来自以前的登录中存储的历史列表。
/etc/passwd ~name 缩写的主目录的来源(可能来自NIS 或NIS+)。
文件名元字符
元字符描述
* 匹配任何有0 个或多个字符的字符串
? 匹配任何单个字符
[abc...] 匹配被括起来的字符中的任何一个;可以用连字符指定一个范围(例如,a-z、A-Z、0-9)元字符描述
{abc,xxx,...} 扩展括号中的每一个由逗号分隔的字符串。这些字符串不一定匹配实际的文件名
~ 当前用户的主目录
~name 用户name 的主目录
示例
% ls new* 匹配new、new.1 等
% cat ch? 匹配ch9 等,但不匹配ch10
% vi [D-R]* 匹配文件名开头是大写D 到大写R 的文件
% ls {ch,app}? 先进行扩展,然后匹配ch1、ch2、app1、app2 等
% mv info{,.old} 扩展成mv info info.old
% cd ~tom 将目录修改为用户tom 的主目录
引用
引用可以禁止字符的特殊意义,使字符按其本来意思加以使用,下表中的字符在C
shell 中有特殊的意义。
字符意义
; 命令分隔符
& 后台执行
( ) 命令分组
| 管道
* ? [ ] ~ 文件名元字符
{ } 字符串扩展字符,通常不要求引用
< > & ! 重定向符号
! ^ 历史替代,快速替代
", \ 用于引用其他字符
` 命令替代
$ 变量替代
space tab newline 单词之间的间隔
下列的字符用于引用:
"" 位于"和"之间的所有的字符都按其字面意义加以采用,下面这些具有特殊意义
的字符除外:
$ 产生变量替代。
` 产生命令替代。
" 表示双引号的结束。
\ 转义下一个字符。
! 历史字符。
newline 换行字符。
,, 除!(历史)和另一个, 以及换行符之外,位于, 和, 之间的所有字符都按其字
面意义加以采用。
\ 在其后的字符会按字面意义采用。通常用于"" 中以转义"、$、` 和换行符。用
于,, 内可转义换行符。经常用来转义一个历史字符(通常是!)。
示例
% echo ,Single quotes "protect" double quotes,
Single quotes "protect" double quotes
% echo "Don,t double quotes protect single quotes too?"
Don't double quotes protect single quotes too?
% echo "You have `ls|wc -l` files in `pwd`"
You have 43 files in /home/bob
% echo The value of \$x is $x
The value of $x is 100
命令方式
cmd & 在后台执行cmd。
cmd1 ; cmd2 命令序列,在同一行执行多个命令。
(cmd1 ; cmd2) 子shell,将cmd1 和cmd2 视为一个命令组。
cmd1 | cmd2 管道,用cmd1 的输出作为cmd2 的输入。
cmd1 `cmd2` 命令替代,用cmd2 的输出作为cmd1 的参数。
cmd1 && cmd2 逻辑与关系,执行cmd1(如果cmd1 执行成功)后再执行cmd2。
这是一种短路操作,如果cmd1 没有成功执行,cmd2 将永远不能执行。
cmd1 || cmd2 逻辑或关系,执行cmd1 或(如果cmd1 执行失败)cmd2。这是
一个短路操作,如果cmd1 执行成功,cmd2 将永远不能执行。
示例
% nroff file > file.out & 后台格式化
% cd; ls 顺序执行
% (date; who; pwd) > logfile 重定向所有输出
% sort file | pr -3 | lp 先对文件排序,再分页输出,然后打印
% vi `grep -l ifdef *.c` 编辑grep 找到的文件
% egrep ,(yes|no), `cat list` 指定一个搜索文件列表
% grep XX file && lp file 如果包含了该模式,则打印文件
% grep XX file || echo XX not found 否则,回显一个错误消息
重定向方式
文件描述符名称一般缩写默认
0 标准输入stdin 键盘
1 标准输出stdout 终端
2 标准错误stderr 终端
重定向方式可以改变一般的输入源和输出目标,参见下面的内容。
简单重定向
cmd > file
将cmd 的输出发送到文件file 中(覆盖)。
cmd >! file
和前一个命令意义相同,另外,还会忽略noclobber 选项。
cmd >> file
将cmd 的输出发送到文件file 中(追加)。
cmd >>! file
和前一个命令意义相同,但写文件的时候忽略noclobber 选项。
cmd < file
cmd 从文件file 中获取输入 。
cmd << text
读取标准输入,直到遇到一个和text 相等的行(text 可以存储在一个shell 变量中)。
输入通常使用终端键入或存储在shell 程序中。使用这类语法的命令通常有
cat、echo、ex 和sed。如果文本text 被引起来(用任何shell 引用机制),则该
输入会按其原来的意思逐字地通过。
多重重定向
cmd >& file 将标准输出和标准错误发送到file 中。
cmd >&! file 和上条命令相同,但忽略noclobber 的设置。
cmd >>& file 将标准输出和标准错误添加到file 的结尾。
cmd >>&! file 和上条命令相同,只是在追加或创建file 时忽略noclobber 选
项。
cmd1 |& cmd2 标准错误和标准输出一起执行管道功能 。
(cmd > f1) >& f2 将标准输出发送到文件f1 中;将标准错误发送到文件f2 中。
cmd | tee files 将cmd 的输出发送到标准输出(通常是终端)和files 中(参见
第二章中tee 下面的示例)。
示例
% cat part1 > book
% cat part2 part3 >> book
% mail tim < report
% cc calc.c >& error_out
% cc newcalc.c >&! error_out
% grep Unix ch* |& pr
% (find / -print > filelist) >& no_access
% sed ,s/^/XX /g, << "END_ARCHIVE"
This is often how a shell archive is "wrapped"
bundling text for distribution. You would normally
run sed from a shell program, not from the command line.
"END_ARCHIVE"
XX This is often how a shell archive is "wrapped",
XX bundling text for distribution. You would normally
XX run sed from a shell program, not from the command line.
|
|