[unix shell] eval, exec, source的区别 及 几个常见命令

简单来说:
1.eval 执行一个命令
2.exec 在新进程中执行一个命令,并且终止当前进程,产生新进程
3.source 在当前进程中执行脚本,不产生新进程。

bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。常用的内部命令有:echo, eval, exec, export, readonly, read, shift, wait和点(.)。
1.echo
命令格式:echo arg
功能:在屏幕上显示出由arg指定的字串。
2.eval
命令格式:eval args
命令eval的功能是將参数(args)读入 C shell 中,然后在加以执行。例如:
101 # set vcom = ‘ls -l ; date’
102 # $vcom
; not found
date not found
在命令 101,vcom 是 ‘ls -l ; date’。当我们來执行“$vocm”,会出现错误信息“; not found”及“date not found”。原因是 C shell 在语法解析中无法理解特殊符号所造成的。符号“;”和命令 date 被理解成是命令 ls -l 后的“文件名称”。所以才会有“not found”。命令eval 便是用來解决这种情況:
103 # eval $vcom
total 1
-r–r–r– 1 akira 1296 Oct 12 07:29 search.c
Tue Oct 18 12:13:53 CST 1994
其实在作法上使用命令 eval 便相当于以下的用法:
104 % echo $vcom | csh
total 1
-r–r–r– 1 akira 1296 Oct 12 07:29 search.c
Tue Oct 18 12:13:54 CST 1994
如果你是在 C shell 下,你也可使用以下的方式:
/bin/csh << EOF
$vcom
EOF
另外在使用命令 eval 上也有技巧,看一互換的技巧:
% set a = ‘$b’
% set b = ‘swapping’
% echo $a
$b
%eval echo $a
swapping
3.exec
命令格式:exec命令参数
功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。
4.export
命令格式:export变量名 或:export变量名=变量值
功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export把它的变量向上带入父Shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly变量名
功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。
6.read
命令格式:read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3成为$2…在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
8.wait
功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。
9.exit
功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。
10.“.”(点)
命令格式:. Shell程序文件名
功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>