需求:

       实时统计当前history命令共有多少条,并显示。


看起来很简单,先写一个脚本如下:


[root@ ~]# cat num_of_history.sh
#!/bin/bash
history | wc  -l

然后,执行它:

[root@ ~]# sh num_of_history.sh
0


奇怪,怎么是0呢?那我们命令行执行这个脚本的内容看看?


[root@ ~]# history | wc  -l
578

明明是可以的啊,为什么放到脚本中就不可以呢?

那么我们在脚本中执行history命令看看怎么样?


[root@cahop ~]# cat history.sh
#!/bin/bash
history
[root@ ~]# sh history.sh
[root@~]#


什么?看起来history命令居然没有执行?why?


我们来看看history命令,这是一个内置命令。

它需要的执行环境有点特殊,因此,我们要想在脚本里执行这个命令,就不能用bash解释器去解释脚本。


那用什么解释器解释哦?

让它需要的环境去解释!


何解?


set  -o   history


对,就是它,用set 命令的 -o选项,会自动模拟你所指定的命令的执行环境。


[root@ ~]# cat num_of_history_new.sh
set -o history
NUM=`history | tail -1  | sed 's/\([0-9]\{1,\}\).*$/\1/'`
echo $NUM


然后,这样做:


[root@ ~]# chmod o+x  num_of_history_new.sh
[root@ ~]# ./num_of_history_new.sh
589


你猜到了吗?不能直接用 sh  num_of_history_new.sh  来执行,否则,又是用bash解释器去解释脚本了。


这个小小的功能,我写的时候,就是因为遇到了脚本中不能执行history命令的问题,baidu,google了大量资料,发现,很多人写的和我一样或者类似,并且很多人还为此发了博客,比如“shell脚本总结”之类的。


看起来,是没有好好验证?


我自己谨记:任何技术经验必须亲手检验。