我正在尝试编写一个脚本来自动禁用/启用我的触摸板,bash
但i3wm
为此,我想获取由 的输出报告的触摸板 ID xinput
。该脚本的想法是能够在不同的机器之间轻松传输,这就是为什么我想自动提取触摸板的设备 ID。
$ xinput
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DLL07BE:01 06CB:7A13 Mouse id=14 [slave pointer (2)]
⎜ ↳ PS/2 Generic Mouse id=22 [slave pointer (2)]
⎜ ↳ DLL07BE:01 06CB:7A13 Touchpad id=15 [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)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Video Bus id=8 [slave keyboard (3)]
↳ Power Button id=9 [slave keyboard (3)]
↳ Sleep Button id=10 [slave keyboard (3)]
↳ Integrated_Webcam_HD: Integrate id=13 [slave keyboard (3)]
↳ Intel HID events id=16 [slave keyboard (3)]
↳ Intel HID 5 button array id=17 [slave keyboard (3)]
↳ Dell WMI hotkeys id=18 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=19 [slave keyboard (3)]
我想要一个单行命令来给id
我Touchpad
.我尝试过awk
实施它,我取得的最好成绩是
$ xinput | awk '/Touchpad/ && /id=/ { print $6 } '
id=15
问题是第六列并不是每次都是设备 ID,所以我需要首先获取包含的行Touchpad
,然后打印后面的数字id=
并在第一个空白/制表符处剪切。
答案1
对于xinput
, 需要一个命令设备参数(如--enable device
)可以使用设备的名称或 ID。
例如,这两者都是等效的:
xinput --enable 'DLL07BE:01 06CB:7A13 Touchpad'
xinput --enable 15
如果您事先不知道设备的完整名称,请使用 的输出xinput --list --name-only
来查找匹配的名称:
xinput --list --name-only | grep Touchpad
xinput --enable "$(xinput --list --name-only | grep Touchpad | head -n 1)"
如 中所述man 1 xinput
,该--list
选项还接受设备参数。所以你可以打印给定名称的 id:
xinput --list --id-only 'DLL07BE:01 06CB:7A13 Touchpad'
或给定 id 的名称:
xinput --list --name-only 15
答案2
您可以用于sed
以下目的:
xinput | sed '/Touchpad/s/.*id=\([0-9]*\).*/\1/;t;d'
这将通过使用捕获组将找到模式的行的全部内容替换Touchpad
为模式中的数字,从而有效地仅打印 ID 部分,并忽略任何不匹配的行(末尾的部分)。id=digits
\([0-9]*\)
;t;d
答案3
使用下面的单个 awk 命令它会正常工作
测试并运行良好
xinput |awk '/Touchpad/{for(i=1;i<=NF;i++){if ($i ~ /id/){print $i}}}'
输出
id=15