Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3285034
  • 博文数量: 346
  • 博客积分: 10189
  • 博客等级: 上将
  • 技术积分: 3125
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 19:46
文章分类

全部博文(346)

文章存档

2013年(35)

2011年(35)

2010年(76)

2009年(48)

2008年(152)

分类:

2008-09-09 18:32:07

SHELL是UNIX作业系统中的'命令编译器'(Command Inter-  
preter),它基本上是一个常驻的执行程式,它在使用者一签入  
成功後就立即被载入(可在签入後以ps指令看到),主要功能则  
在於接受使用者的指令、寻找命令(即档案)的所在并加以执行。  
因此,SHELL的不同可能直接影响使用者输入指令的方式、档  
案寻找的程序及速度等。  

UNIX作业系统的SHELL大致可分为两大系统,一是1970年代  
前期由美国贝尔实验室(BELL LAB)所发展的sh(Bourne Shell),  
它是UNIX系统中的标准SHELL,此一系统後来又发展出ksh(Korne  
Shell)、bash(Bourne Again Shell)等功能更多的介面;另一系  
统是美国柏克来大学(Berkekey)在1970年代後期所发展的csh(C  
Shell),和它属於同一系统的有tcsh等。  

无论上述的那一种shell,它的基本功能与作用都是相同的,  
它们之间的不同处可能在於对同一动作处理程序上的不同(会影响  
命令处理的速度)、所提供内键命令及变数的或多或寡等,其中内  
部命令与变数的多寡直接影响到shell功能的多寡,是使用者在使  
用时最容易直接感受到的。  

在UNIX系统中,使用者可视自己的需要执行sh、ksh、bash、  
csh或tcsh来代替原先使用的shell、改变正在使用的环境;也可  
以用'chsh'指令、输入想使用的shell的路径及名称(如/bin/csh,  
在Y11-Y14机器上还需输入个人使用者的密码),改变以後每次  
login时所使用的shell、使自己所使用的环境能最满足自己使用  
上的需要。  

二、SHELL 的START FILES  

不管你的login shell是那一种shell,每一个shell都有它  
自己的start files,我们设定理想环境时所需使用的指令与设  
定的变数,都可以写在这些start files中,在login时先後加以  
执行,这些start files的名称分别是:  

SHELL START FILES  

sh /etc/profile  
$HOME/.profile  
bash /etc/profile  
$HOME/.profile(or $HOME/.bashrc)  
csh None  
$HOME/.cshrc & $HOME/.login  
tcsh None  
$HOME/.cshrc(or $HOME/.tcshrc)  
& $HOME/.login  

如果这些档案都存在,那麽它们的执行顺序将是:  
1. sh系列 /etc/profile --> $HOME/.profile  
2. csh系列 $HOME/.cshrc --> $HOME/.login  

在这些start files中,/etc下的profile是系统管理者为  
大家设定的,一般使用者无法做任何更动,如果对系统管理者的  
设定觉得不够或不符需要,则可在个人帐号下的.profile、  
.cshrc、.login增加或修正,尤其是对csh及tcsh的使用者而言,  
因为在/etc下并没有start files,所以也不会有系统管理者设定  
好的环境可以使用,使用者就必须自行设定所需要的所有的变数  
与指令,否则常会有寸步难行的感觉,最常见的如许多指令都  
因找不到而不能用(因为没有设path)、键无法使用  
(因键的作用没有定义)...等。  

三、常见的需求与常用的指令  

当我们在UNIX环境中工作,常会为了使自己使用时更方便而  
产生某些需求,这些常见的需求及其设定方式如:  

1. 希望键能有作用  

在$HOME/.profile或$HOME/.cshrc中加上  
stty erase "^H"  

2. 希望在UNIX环境中能使用中文  

在$HOME/.profile(sh系列)中加上  
stty -istrip cs8  
LC_CTYPE=ISO_8859_1  
export LC_CTYPE  
在$HOME/.cshrc(csh系列)中加上  
stty -istrip cs8  
setenv LC_CTYPE iso_8859_1  

3. 希望能有像DOS系统中DOSKEY的功能  
只要是使用bash及tcsh即具备此项功能。  

4. 希望能使用工作站上的汉书编辑器(he)  

在$HOME/.profile(sh系列)中加上  
LANG=big5  
export LANG  
在$HOME/.cshrc(csh系列)中加上  
setenv LANG big5  

5. 希望提示符号能随着路径更动而改变  

在sh及csh中并无法做到这个功能,而在bash及tcsh中  
的设定则分别是:  
bash:在$HOME/.profile中加上  
PS1='`PWD`> '  
或 PS1="w> "  
tcsh:在$HOME/.cshrc中加上  
set prompt='%~> '  

除了上面所提到针对特殊需要所做的设定之外,在做环境设  
定时常用到的指令还有:  

1. stty  
设定对输入(input)的定义与如何做输出,这个指令的  
叁数极为众多,我们可用  

stty -a  
看到所有的叁数及其设定,在这些叁数中,常用的有:  

istrip (-istrip)  
将所有的输入截取成7 bits的资料,然而中文的资  
料都是8 bits的,所以当需要使用中文时,请加上  
'-istrip'这个叁数,以避免输入的资料被破坏。  

cs7 cs8  
设定每一字元的资料都是7 bits或8 bits的资料,  
因此在需要使用中文时,通常会有如下的设定:  
stty -istrip cs8  
iuclc (-iuclc)  
将标准输入的大写字母视为小写(或取消)。  

olcuc (-olcuc)  
将小写的字母以大写型态输出(或取消)。  

echo (-echo)  
将所有的输入由标准输出处输出(或取消输出,即  
在萤幕上看不到自己的输入)。  

stty除了这些叁数外,还可以用来定义某一个键的特定  
功能,如:  
stty erase "^H"  
stty kill "^U"  

2. mesg y (mesg n)  
若在工作时不希望被talk等讯息所打扰,可下'mesg n'  
指令,以避免外来迅息中断正要进行的工作('mesg y'则是  
恢复与外界的沟通)。  

3. umask [nnn]  
设定新增档案或目录的属性(mode),新档案或新目录的  
mode为系统管理者以create所设定的属性减去nnn,如系统管  
理者所设定的档案权利状态是777,而使用者又自行设定了  
umask 022  
则这个使用者在他个人帐号下的每一个新产生的档案的权利  
状态都将会是755(777-022)。  

4. Function 与 Alias  
对於一连串或某一指令,我们可以用function的方式  
(在sh、ksh、bash中)或alias指令(在csh、tcsh、ksh、bash  
中),用一简短字串来代替这一个或一连串的指令,function  
的用法如:  

vi(){  
mesg n  
/usr/ucb/vi $*  
mesg y  
}  

其中,'vi'是function的名称,{}之间是'vi'这个  
function所包含的指令内容,而要注意的是:function的名  
称不能与shell的内键指令(builtin)名称相同,否则这个  
function即无法成立。  

同样的功能,alias指令的用法如:  

alias vi 'mesg n; /usr/ucb/vi !*; mesg y'  

其中vi即是''中所包含字串的别名,别名与各shell的builtin  
名称可以一样(alias本身也是一个内键指令)。  

若我们在某一shell中同时建立一名称相同的function  
与alias(如在bash中),则alias的执行次序优先於function  
的执行。  

四、常用变数设定  

在UNIX环境中的变数可分为两类,一是环境变数(Enviroment  
Variable)、一是shell变数(Shell Variable),二者之间的不同  
处在於:环境变数不会因为shell间的更替而失去这个变数的作  
用,如PATH是一个环境变数,因此,即使您在设定好PATH之後再  
执行另一个shell(如原来是用sh、而後在sh环境中再执行csh),  
PATH这个环境变数仍能继续作用,而shell变数(如csh的cwd)则是  
只有在特定的shell下才有作用,一执行其他shell就失去作用。  

在sh及csh二系列各有其不同的设定变数的方式,为:  

1. Bourne Shell系列  
[VAR]=[STRING or NUMBER]  
export [VAR]  

如果当我们离开shell、进入另一个程式(如tin)之後,  
仍需要使用这个变数,则除了设定这个变数的值外,还需要  
以'export'指令加以宣告,如设定萤幕型态的变数TERM就需  
以'export'来宣告。  

2. C Shell系列  
set [var] = [STRING or NUMBER]  
setenv [var] [STRING or NUMBER]  

其中'set'是单纯设定变数值,'setenv'则除了设定变  
数值外,还包含了类似sh中'export'的功能。  

而无论是Bourne Shell或C Shell,它们都有一些基本的、  
共同的常用变数,如:  

1. PATH  

设定执行档的寻找路径,若现行目录也要包含在寻找的  
路径中,则需在设定路径时给予一'.',表示现行目录亦包含  
在寻找的路径中,如:  

PATH=.:/bin:/usr/local/bin:/usr/ucb  
或  
set path=(. /bin /usr/local/bin /usr/ucb)  

2. EDITOR  

设定想要使用的编辑器,如  
EDITOR=/usr/ucb/vi  
或  
setenv EDITOR /usr/ucb/vi  

3. HOME  

设定个人帐号home directory的所在位置,通常在login  
时即叁考/etc/passwd而给予一设定值,因此除非使用者有某  
些特殊需求,通常不会重新设定。  

4. SHELL  

同样是在login时即会叁考/etc/passwd的内容而自动设  
定,使用者即使重新设定这个变数的内容,对帐号的使用也  
不会有任何影响。  

5. 提示符号的设定  

在sh 中: PS1="[STRING]"  
PS2="[STRING]"  
在csh中: set prompt="[STRING]"  

当然以上所列的只是使用得较为广泛的变数,若您觉得这些  
不够用,可用man sh、man csh、man tcsh、man bash指令查阅各  
shell的说明,在其中您将可看到各个shell所包含的变数及各变数  
的用法。  

若不清楚某一变数的设定内容,可用'echo $[VAR]'来观察  
变数的内容,如:  

echo $PATH  


五、SHELL 环境的异动  

前面所提到start files中的设定将在使用者login时执行,  
但当我们要在线上直接改变所使用的shell(如直接执行'csh'或  
'exec csh',此时不会执行start files)或是要改变设定的内容,  
在编修了start files或script files之後,可利用下列指令将  
环境更新,而不必重新login:  

. [script file] (在sh 系列的shell中)  
source [script files] (在csh系列的shell中)  

直接执行一个script file与用'.'、'source'指令执行各有  
其不同的效果,我们可建立一内容为  

cd / (或cd [DIR])  

的script file来观察它们之间的差异:  

因script file的执行环境是一内定或自定的subshell(可在  
script file的第一行用类似'#!/bin/csh'指令加以设定),  
所以它的直接执行并无法真正将shell环境的工作目录切换到  
/,而script file一结束,subshell即不存在、'cd /'指  
令的效果也告消失;而用'.'或'source'执行则是真正将  
shell的工作环境下的工作目录更换到/,不会因为script  
file的结束而使档案中指令的效果消失。
阅读(1837) | 评论(0) | 转发(0) |
0

上一篇:makefile原理

下一篇:深入理解sizeof

给主人留下些什么吧!~~