需求:
实时统计当前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脚本总结”之类的。
看起来,是没有好好验证?
我自己谨记:任何技术经验必须亲手检验。