[Linux Shell学习系列十五]其他Linux Shell种类介绍-1.C Shell
D31
Linux(以及Unix或类Unix)下的Shell有很多种,根据环境和编程需求的不同有时需要使用不同的Shell。本章了解另外两种常用的Shell:C Shell和Korn Shell。
1. csh简介
C Shell(简称csh)是一个通常运行在文本窗口并允许用户输入命令的命令处理程序。也可以从脚本文件中读取命令。
与其他Linux Shell类似,支持文件名统筹、管道、here documents、命令替换、变量和用于条件测试和循环的控制结构。
csh与其他Shell的不同之处在于它的交互性特性和总体风格:更像C语言,可读性更好。
csh和tcsh:
在很多系统中(如Mac OS X和RedHat Linux),csh实际是tcsh,tcsh是csh的改进版。这些系统中csh和tcsh都链接到包含tcsh可执行程序的同一个文件,所以调用的是同一个C Shell改进版。
在Debian、Ubuntu及它们的衍生版本中,csh和tcsh是两个不同的包。
tcsh添加了文件名和命令不全功能,以及从Tenex系统借鉴来的命令行编辑概念(t的由来)。tcsh兼容csh。
2. csh的特性
1)表达式
csh:
#!/bin/csh
if ( $days > 365 ) then echo This is over a year. endif
Bourne Shell:
#!/bin/bash
if [ $days -gt 365 ] then echo This is over a year. fi
在Bourne Shell缺少表达式语法,方括号条件需要由运行较慢的外部程序test来计算。
相比之下,csh可以直接计算表达式,这使它更快速。至于高可读性,它的表达式使用的语法和操作符大部分是从C语言复制的。
2)交互性
引入新特性使其更简单快速,同时更友好的终端打印命令:
历史记录:内部命令history允许用户重调先前的命令,并通过几个按键就可以返回它们。如!!会执行前一个命令,!$表示前一个命令的最后一个参数;
编辑操作符:编辑不仅可以在前一个命令的文本中完成,同样可以在变量替换时完成。操作符从单个字符串搜索/替换编号,到解析路径名,到扩展指定的段。
别名:内部命令alias允许用户定义别名,当用户输入一个别名时,C Shell将在内部将其解释为用户先前定义的内容。对于很多简单的情况,别名执行得更快速,并且比脚本更方便。
目录堆栈:允许用户放入和去除当前的工作目录,使在文件系统中的不同地方之间前后跳转更方便。
波浪号:使用字符~为home目录提供了一个速记方法。
cdpath:将搜索路径的概念扩展到cd命令,如果指定的目录不在当前目录,csh将尝试在cdpath目录中找到它。
作业控制:通过Ctrl+Z组合键挂起当前活跃的任务,并创建一个C Shell新任务。可以使用fg命令在任务职期间前后切换。
路径散列法:加速搜索可执行文件的速度:查阅一个通过扫描path的所有目录构件的哈希表,而不是所有目录。这个表可以用rehash命令来更新。
3. csh的内部变量
csh中的某些变量控制着行为,并且这些变量中有些不需要赋值(即使用set命令简单的设置变量名资深,而不要指定任何值)。
常用的:
| 内建变量 | 说明 |
| argv | 用于shell脚本中存放参数值的特殊变量 |
| autologout | 包含Shell自动退出前Shell可以处于空闲状态的分钟数 |
| history | 设置可以存放多少历史(先前运行的命令)行 |
| ignoreeof | 阻止使用Ctrl+D组合键退出 |
| noclobber | 使用重定向阻止文件的覆盖 |
| path | 包含当运行程序或Shell脚本时需要搜索的目录列表 |
| prompt | 设置命令行提示字符串 |
| term | 包含当前终端的类型 |
使用set命令定义变量,csh既支持常规变量,也支持数组变量
set autologout=5 set varlist=(a b c)
unset命令可以消除任何不需要的变量。
4. csh的内部命令
如果一个内部命令作为管道的任意部分出现(除了是管道的最后一条命令外),则这个内部命令将运行在子Shell中。
如果从csh命令行提示符中输入命令,则系统首先搜索内部命令,若内部命令不存在,会搜索由path变量指定的目录。可能存在csh内部命令和操作系统命令具有同样的名称,但不同的运作方式。
在运行csh命令时,脚本第一行需要为:"#!/bin/csh"。
| 内部命令 | 语法 | 说明 |
| @ | @ [Name[n] = Expression] |
不指定参数时,@命令显示所有Shell变量的值。 否则,把Name变量的值设置为表达式的值。 当指定了语法中的n,Name数组变量的第n个元素将被设置为表达式的值, 且Name数组变量和第n个元素必须已经存在。 如果表达式中包含<、>、&、|(竖线)字符, 这部分表达式必须放在圆括号中。 |
| alias | alias [Name [WordList]] |
不指定参数,alias命令显示所有别名。否则,命令显示指示Name的别名。 如果指定WordList,则把WordList的值指定给Name。 指定的别名Name不能被alias或unalias。 |
| bg | bg [%Job ...] |
将当前任务或%Job指定的任务放到后台执行, 恢复运行处于停止状态的任务。 |
| break |
用于终止foreach或while循环,继续运行这些循环之后的命令 |
|
| breaksw |
用于终止switch命令,继续运行endsw命令之后的命令 |
|
| case | case Lable: | 用于在switch命令中定义一个label |
| cd | cd [Name] | 等同于cddir命令 |
| cddir | cddir [Name] |
用于变更当前的目录到Name指定的目录。 如果没有指定Name,则切换到home目录。 如果Name不是当前目录的子目录,且其路径不以/、./、../开头, shell会自动检查cdpath变量的每一部分,看是否有子目录匹配Name。 如果以/开头,shell将尝试看它是否是一个目录。 |
| continue | 用于跳过while或foreach的当前循环,直接执行下一次循环 | |
| default | 标识switch语句的默认情况,出现在所有其他case语句之后 | |
| dirs | 用于显示目录堆栈。 | |
| echo | 写字符串到Shell的标准输出。 | |
| else | 使用语句if(expr) then... else... enif时,else是csh的内部命令。 | |
| end |
用于表示foreach命令的结束。 foreach和end必须放在分隔的两行中。 |
|
| endif | 用于表示if语句的结束 | |
| endsw | 用于表示switch语句的结束 | |
| eval | eval Parameter ... |
将参数Parameter作为shell的输入,并执行当前Shell上下文产生的命令。 通常用于执行作为命令替换或变量替换的结果产生的命令, 因为解析发生在这些替换之前。 |
| exec | exec Command | 运行指定的命令代替运行当前Shell。 |
| exit | exit (Expression) |
以shell变量status的值退出Shell, 或是以表达式Expression的值退出Shell |
| fg | fg [%Job ...] |
把当前任务或%Job指定的任务放在前台执行, 继续运行处于停止窗台的任务 |
| foreach | foreach Name (List) Command... |
用于连续地把List中每一个元素的值赋给Name变量, 并执行foreach与end命令之间的一系列命令 |
| glob | glob List | 与echo命令类似 |
| history | history [-r | -h] [n] |
显示历史记录列表。 如果指定数量n,则只显示最新的n条。 -r选项表示倒序。 -h选项表示显示记录时不显示编号。 |
| jobs | jobs [-l] | 用于列出活跃的任务编号和名称。使用-l选项,同时列出进程ID。 |
| kill | kill -l | [[-signal] % Job... | PID...] |
发送TERM信号或由Signal指定的信号到指定的任务或进程。 使用-l选项表示列出信号的名称。 |
| limit | limit [-h] {Resource [Max-Use]} |
限制当前进程的指定资源的使用。 进程资源限制定义在文件/etc/security/limits中。 可控制的资源是CPU时间、文件大小、数据大小、 core dump大小和内存的使用。 |
| logout | 用于注销登录Shell | |
| nice | nice [+n] [command] |
不指定数值n,将运行在这个Shell中的命令的优先级设为24. 指定了+n,则优先级会加上指定的数值。 如果n和command都被指定,命令会以24加上指定的数值为优先级运行。 如果有root权限,可以指定一个负值。 |
| rehash |
使Shell变量path中的目录内容哈希表冲计算。 当用户添加了一个命令到path变量中的自己的目录中, 或某人修改了一个path变量中的系统目录的内容时, 才需要运行rehash命令。 |
|
| set | set [[Name[n] [=Word]] | [Name= (list)]] |
当没有指定参数时,显示所有变量的值。 仅指定了变量名Name,C Shell将把变量Name的值设为空字符串。 |
| setenv | setenv Name Value | 将Name指定的环境变量的值设为Value。 |
| shift | shift [Variable] |
将Shell变量argv的元素向左移。 如果argv或指定的变量没有设置或其值小于一个单词, 则会产生一个错误。 |
| source | source [-h]Name |
读取并执行名称为Name的文件的命令。 这些命令不会被存放到history的列表中。 使用-h选项,则把读取的命令存入history但不执行。 |
| stop | stop [%Job...] | 用于停止当前任务或运行在后台的指定任务。 |
| time | time [Command] |
控制命令的自动计时。 如果不指定Command,会显示当前Shell及其子Shell使用的时间概况。 如果指定Command,则命令的运行时间将被计时,命令执行完成后,Shell会显示用时的概况。 |
| umask | umask [Value] |
用于确定文件权限。 指定的Value用于确定文件创建时的权限,默认是022. 如果不指定Value,则显示当前设置的值。 |
| unalias | unalias *|Pattern |
用于移除指定的别名。 如果指定*,则移除所有的别名。 unalias一个不存在的别名不会产生错误。 |
| unlimit | unlimit [-h] [Resource] |
用于移除指定资源的限制。 不指定资源Resource,则取消所有资源的限制。 |
| unset | unset *|Pattern |
用于删除指定的变量。 如果指定*,则删除所有定义的变量。 如果指定的变量没有设置,不会产生错误。 |
| while |
while(Expression) Command ... end |
当表达式Expression的值非0时,执行while和end语句之间的所有命令。 可以使用break命令结束while循环; 可以使用continue命令跳过本次循环而直接执行下一次循环; while和end语句必须单独方案分隔的两行中。 |
5. tcsh在csh基础上的新特性
略。
本节结束

浙公网安备 33010602011771号