大家好,我正在尝试解析xinput stdout来找到合适的设备来禁用键盘。所以这是我的代码,但它看起来很草率,我想知道是否有更好的方法。
xinput -list --short | grep -E "keyboard.*slave" | awk 'NR==1{print substr($0,7,41)}' | awk '{$1=$1}1'
我不知道子串需要多长时间,所以我将41作为索引来包含潜在设备名称的最大长度。这导致需要修剪的末端有一个空白区域,所以我将它传递给另一个awk管道。我想知道最后2个awk调用是否可以压缩为1
答案 0 :(得分:1)
您可以使用sub()
代替空白区域,awk
也可以do the pattern match代替您:
xinput -list --short | awk '
/keyboard.*slave/ {
s = substr($0, 7, 41);
sub(/ *$/, "", s);
print s;
exit;
}'
这会在第一个匹配行之后停止,我认为你想要,因为原作只对awk
读取的第一个记录起作用。
所以,
$ cat keyb
mouse mouse something
keyboard slave foo
keyboard slave bar
$ awk '/keyboard.*slave/ { s = substr($0, 7, 41); sub(/ *$/, "", s); print s; exit; }' < keyb
rd slave foo
答案 1 :(得分:1)
作为禁用键盘的替代方法,您可以直接使用xinput。
xinput的输出如下:
$ xinput list
Virtual core pointer id=2 [master pointer (3)]
↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
↳ VirtualBox mouse integration id=9 [slave pointer (2)]
↳ ImExPS/2 Generic Explorer Mouse id=11 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Sleep Button id=7 [slave keyboard (3)]
↳ Video Bus id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=10 [slave keyboard (3)]
键盘描述即AT Translated Set 2 keyboard
始终相同。不同的是id = 10(系统可以在重新启动时分配不同的id。)
因此,您可以获得键盘的ID,如
$ xinput list --id-only "AT Translated Set 2 keyboard"
10
然后您可以禁用键盘
$ kid=$(xinput list --id-only "AT Translated Set 2 keyboard")
$ xinput disable "$kid" #use xinput enable to enable it.
甚至您可以直接使用设备描述xinput disable:
$ xinput disable "AT Translated Set 2 keyboard"
因此,由于设备描述始终相同,因此您无需任何文本处理即可识别和禁用键盘。