shell脚本实现键盘LED灯闪烁

很幸运,在Ubuntu13.10的Terminal下发现了setleds命令,直接运行该命令后有如下输出:
xinu@slam:~$ setleds
KDGKBLED: Inappropriate ioctl for device Error reading current flags setting. Maybe you are not on the console?
查了一会资料,发现在Gnome界面下的Terminal执行该命令有问题,需要切换到TTY界面下(按CTRL+ALT+F1至F6),再切换回Gnome则按CTRL+ALT+F7组合键即可,该Bug已在http://askubuntu.com/questions/339028/caps-lock-indicator-not-synced,我们先不管,直接按CTRL+ALT+F1组合键切换至tty0,使用同样的帐号和密码登录,此时输入setleds命令会有如下提示:
xinu@slam:~$ setleds
Current default flags: NumLock off CapsLock off ScrollLock off
Current flags: NumLock off CapsLock off ScrollLock off
Current leds: NumLock off CapsLock off ScrollLock off
而相应的帮助信息查看man setleds命令,其中主要的使用格式和参数如下:
setleds [-v] [-L] [-D] [-F] [{+|-}num] [{+|-}caps] [{+|-}scroll]
从上面资料可以看到其实际上只控制Number Lock、Caps Lock、Scroll Lock三个灯的状态,分别控制如下:
1.控制单个灯
Number Lock亮:setleds +num
Number Lock灭:setleds -num
Caps Lock亮:setleds +caps
Caps Lock灭:setleds -caps
Scroll Lock亮:setleds +scroll
Scroll Lock灭:setleds -scroll
2.控制组合灯
任意两灯:
setleds +num -caps
setleds -num +scroll
……
全三灯:
setleds +num +caps +scroll
setleds +num -caps -scroll
……
有了上面的基础,我们再使用Shell的while循环和sleep命令,最终有了setleds_flash.sh脚本,其内容如下:
#!/bin/sh
while [ true ];
do
    setleds +num +caps +scroll
    sleep 1
    setleds -num -caps -scroll
    sleep 1
done
最后执行bash -e setleds_flash.sh命令即可执行上述脚本,接下来就注意PC键盘右上角三个灯吧,每隔一秒钟亮灭一次。
注意:需切换到tty界面运行;还有使用CTRL+C中断脚本执行后,我的Caps Lock键不会跟随Caps Lock键的敲击而改变需将其亮状态使用setleds -caps切换为灭后才能正常响应,这是个待处理问题,看来setleds控制的Bugs还不少。
至此,我们演示了Shell脚本操作PC键盘灯(硬件)的亮灭,是不是有点小成就感啊,别骄啊,后面还有其他的方式来实现该效果。

评论

此博客中的热门博文

I/O映射之I/O端口

通过Netlink检测网线插拔

使用seq_file