#! /bin/sh -x
#
# xievd [INTERVAL]
#
# Poll `xinput` device list every INTERVAL seconds (default: 10)
# and run script in ~/.xievd/${device_name}.sh when a device is
# plugged-in (or pulled out).
#
# The device name is the same as given by `xinput --list`, with
# the following transformations applied:
# * any non-alphanumeric character is deleted (except: space, `_` and `-`)
# * leading and trailing spaces are removed
# * any sequence of 1 or more space chars is converted to a single `_`
#
interval=${1:-10}
scripts_dir="$HOME/.xievd"
if [ ! -d "$scripts_dir" ]; then
echo 1>&2 "xievd: No scripts directory -- exiting."
exit 1
fi
state_dir="$(mktemp -t -d xievd.XXXXXX)" \
|| { echo 1>&2 "xievd: Cannot create state directory -- exiting."; exit 1; }
trap "rm -rf $state_dir; exit;" TERM QUIT INT ABRT
process_xinput_device_list() {
touch "${state_dir}/.timestamp"
# find new devices and run "start" script
xinput --list --short \
| fgrep slave \
| sed -r -e 's/id=[0-9]+.+//;s/[^a-z0-9 _-]//ig;s/^ +//;s/ *$//;s/ +/_/g;' \
| (while read device; do
if [ ! -e "${state_dir}/${device}" ]; then
# new device, run plug-in script
[ -x "${scripts_dir}/${device}" ] && "${scripts_dir}/${device}" start
fi
touch "${state_dir}/${device}"
done)
# find removed devices and run "stop" script
for d in "$state_dir"/*; do
if [ "${state_dir}/.timestamp" -nt "$d" ]; then
# device removed, run "stop" script
device="$(basename $d)"
[ -x "${scripts_dir}/${device}" ] && "${scripts_dir}/${device}" stop
rm -f "$d"
fi
done
}
# main loop
while true; do
process_xinput_device_list
sleep $interval
sleep 1
done
# cleanup
rm -rf "$state_dir"
您可以
cron
命令或将其添加到您的启动中,但都不是特别优雅。如果我是你,我会把它添加到我的 udev 规则中,让系统检测事件并在需要时触发命令。首先,我们需要鼠标供应商和产品字符串。您可以通过
lsusb
. 寻找你的鼠标。这是我的鼠标出现:在零件
1532:000f
中,1532
是供应商并且000f
是产品。那么我们给 udev 添加一个规则。udev 规则位于
/lib/udev/rules.d/
. 你可以自己写,也可以厚颜无耻地编辑另一个。里面还有一个有用的小自述文件,我建议你仔细阅读(cat /lib/udev/rules.d/README
)。无论你想添加这样的规则。请注意,我使用之前的 ID 来完成这项工作。
udev应该立即拿起它。
注意 udev 在配置设备时可以自己做一些非常聪明的事情。你可能根本不需要
xinput
。这是鼠标的自定义配置示例。除了启动一个小守护程序之外,我想不出其他解决方案,
xinput --list
它会在插入或移除设备时定期轮询并运行命令。示例代码:
将上面的代码保存在
xievd
PATH 中某处的可执行文件中,将其添加到启动应用程序中,然后创建一个~/.xievd/USB_Optical_Mouse
shell 脚本: