[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基础上的新特性

略。

 

本节结束

posted @ 2020-06-17 09:25  workingdiary  阅读(761)  评论(0)    收藏  举报