2007年5月10日星期四

Linux eval command

eval的作用是将eval后面的内容也当作shell命令来执行, 比如以下命令:

[frank@aladdin test_eval_sh]$ aa="date"
[frank@aladdin test_eval_sh]$ echo $aa
date
[frank@aladdin test_eval_sh]$ eval $aa
Thu May 10 16:30:32 CST 2007
[frank@aladdin test_eval_sh]$

eval这个命令用起来有些复杂, 如何理解其"二次解释执行"是比较重要的
有个文件test_eval_1.sh:
var1="date"
date
echo $var1

[frank@aladdin test_eval_sh]$ sh test_eval_1.sh
Thu May 10 18:03:12 CST 2007
date

[frank@aladdin test_eval_sh]$ eval `cat test_eval_1.sh`
date: too many non-option arguments: 1234 ...
Try `date --help' for more information.
[frank@aladdin test_eval_sh]$
就相当于date命令后面跟了两个以上的错误的参数. 这里注意$var1的值并不是test_eval_1.sh中的"date", 而是存在与外部shell中的一个值. shell中的变量的行为要进一步研究一下.

如果将test_eval_1.sh的内容改为
var1="date"
date;
echo $var1

[frank@aladdin test_eval_sh]$ sh test_eval_1.sh
Thu May 10 18:08:02 CST 2007
date
[frank@aladdin test_eval_sh]$ eval `cat test_eval_1.sh`
Thu May 10 18:08:21 CST 2007
1234 4556
[frank@aladdin test_eval_sh]$
两者的执行结果结果类似

注意, 使用eval `cat xxx`的方式, 不能处理xxx中有#注释行的内容, 如果文件中有#则结果不同.

没有评论: