详解Bash命令行处理

http://tech.ddvip.com   2006年08月11日    社区交流

本文详细介绍详解Bash命令行处理

  $()是命令替换,返回命令的输出字符串。

  其中dircolors命令根据/etc/dircolors配置文件生成设置环境变量LS_COLORS的bash代码,内容如下

  [root@localhost root]# dircolors -b > tmp
[root@localhost root]# cat tmp
LS_COLORS='no=00:fi=00:di=01;34:ln=01; ......
export LS_COLORS
#这里我没有指定配置文件,所以dircolors按预置数据库生成代码。
其输出被eval命令传递给shell执行。

  eval是对Bash Shell命令行处理规则的灵活应用,进而构造"智能"命令实现复杂的功能。

  上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。

  其实它是bash的难点,是高级bash程序员的必修之技。

  四、命令优先级表

  1、别名

  2、关键字

  3、函数

  4、内置命令

  5、脚本或可执行程序($PATH)

  五、鉴于一些学习中会遇到的困惑,我再给出一些有趣的命令。

  1、command builtin enable

  上面的命令行提及过,第11步会进行命令查找,那它的具体过程如何呢?

  它的默认查找次序为函数,内部命令,脚本和可执行代码。我们往往要在实际编程中跳过一些查找项以满足一定的功能需求。这时候就要用到这三个命令来施展魔法~~

  2、command

  跳过别名和函数的查找,换句话说,它只查找内部命令以及搜索路径中找到的脚本或可执行程序。

  这里举个有趣的例子。

  [root@home root]# type -all pwd
pwd is a shell builtin
pwd is /bin/pwd
[root@home root]# cat myscript2
#!/bin/sh
pwd(){
    echo "This is the current directory."
    command pwd
}
pwd
[root@home root]# ./myscript2
This is the current directory.
/root

  我用pwd()函数取代了内置命令pwd以及外部命令/bin/pwd,然后在脚本里执行内置命令pwd。在这里我们为什么要用command呢?是为了避免函数陷入递归循环,因为函数名与内置命令同名,而函数的优先级比内置命令高。

  3、builtin

  顾名思义,它只查找内置命令。这个命令很简单,就不多说了。

  4、enable

  与builtin相反,它屏蔽一个内置命令,允许运行一个shell脚本或同名的可执行代码而无须给出完全路径名。

  举个例子吧。

  pwd命令有两个,一个是shell内置的,一个是可执行程序。

  当执行一些奇怪的路径名后,shell内置的pwd会打印出"错误信息",但外部的pwd会打印出当前目录的"原来面目"。请看下面:

  [root@home root]# cd //
[root@home //]# pwd
//
[root@home //]# type -all pwd
pwd is a shell builtin
pwd is /bin/pwd
[root@home //]# /bin/pwd
/
[root@home //]# enable -n pwd
[root@home //]# pwd
/

  这样,用enable -n屏蔽内置pwd命令后,就可以用外部pwd打印出正确的路径名了。

来源:LinuxSir.Org    作者:home_king    责编:豆豆技术应用

正在加载评论...