LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1151|回复: 16

eval $(dircolors -b /etc/dircolors) 这里的$()什么意思?

[复制链接]
发表于 2004-2-8 14:53:19 | 显示全部楼层 |阅读模式
为什么要用$()把dircolors -b /etc/dircolors框起来?系统究竟是如何执行这句的呢?谢谢
发表于 2004-2-8 18:33:10 | 显示全部楼层

回复: eval $(dircolors -b /etc/dircolors) 这里的$()什么意思?

最初由 qhgary 发表
为什么要用$()把dircolors -b /etc/dircolors框起来?系统究竟是如何执行这句的呢?谢谢


eval语句通知shell接受eval参数,并再次通过命令行处理的所有步骤运行它们。
它使你可以编写脚本随意创建命令字符串,然后把它们传递给shell执行;
$()是命令替换,返回命令的输出字符串。
  1. eval $(dircolors -b /etc/dircolors)
复制代码
其中dircolors命令根据/etc/dircolors配置文件生成设置环境变量LS_COLORS的bsh代码,内容如下
  1. [root@localhost root]# dircolors -b > tmp
  2. [root@localhost root]# cat tmp
  3. LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:';
  4. export LS_COLORS
复制代码
NOTE:这里我没有指定配置文件,所以dircolors按预置数据库生成代码。
其输出被eval命令传递给shell执行。
 楼主| 发表于 2004-2-8 18:42:47 | 显示全部楼层
那是不是eval后面一般都会用这个$()
发表于 2004-2-8 18:56:15 | 显示全部楼层
最初由 qhgary 发表
那是不是eval后面一般都会用这个$()
使用eval可以编写能够“编写”和执行其他程序的程序。
实际上不用eval也可完成,方式是通过echo命令到一个临时文件中,然后使用source执行该文件,但这样做效率会差一些。
以上摘自《Learning the bash Shell》

也就是说,当一命令产生的输出是shell代码,而我们又想再次执行该代码(执行程序的程序)时,就需要eval这种bash高级特性。在日常shell编程中一般不会用到eval。自然,eval $()只是eval的一种应用模式而已。

比如说,你也可以这样用。
  1. codestr="ls -alF"
  2. eval $codestr
复制代码
 楼主| 发表于 2004-2-8 21:36:15 | 显示全部楼层
--------------------------------------------------------------------------------

使用eval可以编写能够“编写”和执行其他程序的程序。
实际上不用eval也可完成,方式是通过echo命令到一个临时文件中,然后使用source执行该文件,但这样做效率会差一些。

--------------------------------------------------------------------------------
这句让我彻底明白了,谢谢阿:)
 楼主| 发表于 2004-2-8 21:37:37 | 显示全部楼层
那我想问,是不是只有eval有这个功能呢,说穿了就是执行内存中的shell脚本对吧,除此以外eval还做什么呢?为什么叫eval?看起来像和数字有关一样
发表于 2004-2-9 16:46:42 | 显示全部楼层
最初由 qhgary 发表
那我想问,是不是只有eval有这个功能呢,说穿了就是执行内存中的shell脚本对吧,除此以外eval还做什么呢?为什么叫eval?看起来像和数字有关一样


准确来说,eval是对Bash Shell命令行处理规则的灵活应用,进而构造"智能"命令实现复杂的功能。
上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。
其实它是bash的难点,是高级bash程序员的必修之技,我也在学习当中,还未完全理解透彻。呵呵,举不了很多例子来说明。
 楼主| 发表于 2004-2-10 20:03:38 | 显示全部楼层
"重复了1次命令行参数传递过程"
怎么理解这句话?
发表于 2004-2-10 20:14:05 | 显示全部楼层
最初由 qhgary 发表
"重复了1次命令行参数传递过程"
怎么理解这句话?

也就是把上次命令返回的字符串当作命令,又执行一次。
进一步说,这只是重复了一遍shell的命令行处理,是eval很普通的应用。
发表于 2004-2-11 11:01:16 | 显示全部楼层
换个简单的例子,那就很好理解了

$ echo uname
uname
$ eval `echo uname`
Linux

$()是``的一种比较规范的写法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表