打印

Bash命令行处理[详解](转自sir之home_king)

例子2:
设置系统的ls色彩显示

代码:
eval $(dircolors -b /etc/dircolors)
eval语句通知shell接受eval参数,并再次通过命令行处理的所有步骤运行它们。
它使你可以编写脚本随意创建命令字符串,然后把它们传递给shell执行;
$()是命令替换,返回命令的输出字符串。
其中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)


鉴于一些学习中会遇到的困惑,我再给出一些有趣的命令。
command builtin enable
上面的命令行提及过,第11步会进行命令查找,那它的具体过程如何呢?
它的默认查找次序为函数,内部命令,脚本和可执行代码。我们往往要在实际编程中跳过一些查找项以满足一定的功能需求。这时候就要用到这三个命令来施展魔法~~
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呢?是为了避免函数陷入递归循环,因为函数名与内置命令同名,而函数的优先级比内置命令高。

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

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打印出正确的路径名了命令后,就可以用外部pwd打印出正确的路径名了
Linux或许只是美国人的一种非Windows的选择,因为微软是他们国家的。微软绝不会干危害美国国家安全的事,微软暴利也只是美国人把钱从一个口袋中转移到另一个口袋中而已。美国人在Linux问题上可以超然。中国人,你有超然的资本吗?

TOP