众所周知,在linux系统下执行过的命令,都会被系统自动记录,使用上下键就可以快捷地切换历史命令,然后按回车就可以执行。 使用上下键切换命令,然后按下回车即可执行该命令,这种特性像不像在操作一个菜单?因此我们是否可以将其当做一个菜单功能来用呢? 答案是可以的!这种方式简单便捷,可以用于批量测试开发板某些功能的场景。 这里使用ZYNQ开发板举例。 使用vi命令创建一个名为Command_Menu的文件,在里面写入你想要执行的菜单命令,例如
date
./wifi.sh
./lcd.sh
./tp.sh |
这里写入了4条命令,第一条为时间显示命令date,后面三条命令分别执行了三个脚本,wifi测试脚本、lcd测试脚本、触摸测试脚本。这四个命令就是我们创建的菜单里的4个项目。 创建完成后,在系统启动文件/etc/init.d/rcS 文件中添加以下这段话,在开机时将我们写的文件内容拷贝到/home/root/.bash_history中
cp /home/root/Command_Menu /home/root/.bash_history |
这里注意,上面的那句话必须添加在exec /etc/init.d/rc S这句话前面,否则无效 这里添加完成后,使用reboot命令重新启动开发板后,即可直接使用上下键切换命令了,就像使用一个“菜单”一样。 既然不需要输入命令,正好我使用的这块ZYNQ开发板上有两个按键,其实切换历史命令只需要使用上键即可,使用命令则是回车键,所以两个按键就能实现“菜单”功能。 既然如此,我们在设备树中添加这两个按键,并分别赋予它们上键和回车键的功能,加上lcd屏幕后,便可脱离PC端,只需要自带的两个按键即可执行“菜单”里的所有命令。 keys {
compatible = "gpio-keys";
autorepeat;
key0 {
label = "ps_key";
linux,code = <KEY_UP>;
gpios = <&gpio0 47 GPIO_ACTIVE_LOW>;
debounce-interval = <15>;
};
key1 {
label = "pl_key";
linux,code = <KEY_ENTER>;
gpios = <&gpio0 55 GPIO_ACTIVE_LOW>;
debounce-interval = <15>;
};
};
|
但是,这个“菜单”设计有一个缺陷,由于每次执行命令后,linux都会将其自动保存到到历史记录中,因此就会导致“菜单”越来越长,除非重新开机“重置菜单”。这个问题使用history命令就可以解决,使用history -r命令可以将.bash_history里的记录读入当前历史记录,也就是“重置菜单”。因此只需要在自己运行的脚本末尾添加一句history -r,即可弥补这个缺陷。 但是,history在脚本中默认是无法使用的,我们对比一下在shell下“直接使用set -o命令”与“使用含set -o命令的脚本”二者的区别,左边是在shell下使用的结果,右边是在脚本中使用的结果
直接使用set -o命令
使用含set -o命令的脚本
可以发现,二者是不一致的,在脚本中使用时,history命令默认没有被开启,因此我们需要先把它开启,然后才能使用 因此在脚本中的末尾添加history -r语句之前,需要先添加set -o history语句开启history命令功能。 然而,以上只是我一厢情愿的想法,我测试之后发现并非如此,由于在使用脚本时,开启的是另一个shell,所以这里操纵的history其实是另一个shell的历史,脚本运行结束后,会切换回原来的shell,因此对history的任何操作都无效,所以“命令菜单”越用越长的缺陷仍然存在,只能将history -r也加入到“命令菜单”里,然后手动“重置菜单”。
|