내가 실행할 때 :
cat /proc/bus/input/devices
...다음과 같은 출력이 나타납니다.
...
I: Bus=0003 Vendor=040b Product=2000 Version=0110
N: Name="Generic USB Keyboard"
P: Phys=usb-0000:00:1d.0-1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0/input/input14
U: Uniq=
H: Handlers=sysrq kbd event7
B: PROP=0
B: EV=120013
B: KEY=1000000000007 ff9f207ac14057ff febeffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
...
/dev/input/...
스크립트가 이 정보를 구문 분석하고 이 키보드를 나타내는 해당 장치(in)를 결정하는 방법이 있습니까 ?
도움이 된다면 장치 이름을 사용하겠습니다 xorg.conf
.
답변1
출력에서 다음을 확인하세요.
H: Handlers=[...] event7
어디이벤트 7장치는 다음과 같습니다.
/dev/input/event7
답변2
나는 이 목적을 위해 bash 파서를 작성해야 했습니다. 출처는 다음과 같습니다.
#!/bin/sh
inputDevicesInfoFilePath ()
{
echo "/proc/bus/input/devices"
}
inputDevicesInfo ()
{
cat $(inputDevicesInfoFilePath)
}
# arguments: device name, file line prefix
inputDeviceValue ()
{
# constants
local INFO_FILE=$(inputDevicesInfoFilePath)
local NAME_PREFIX="N: Name="
# name the function arguments
local devName=$1
local linePrefix=$2
# find the line number in the info file containing
# both the name prefix and device name argument
local lnNo=$(grep -n "${NAME_PREFIX}" ${INFO_FILE} | grep ${devName} | head -n1 | cut -d: -f1)
# starting from the line number previously determined,
# find the first line which contains the prefix argument
# and extract the value token from that line
local value=$(tail +${lnNo} ${INFO_FILE} | grep "${linePrefix}" | head -n1 | cut -d= -f2)
# "return" the value via an echo
# if no value was found, don't echo anything
# but (literally) return an error code
if [ -z "${value}" ] ; then return 1; fi;
echo ${value}
}
# arguments: device name
inputDevicePhys ()
{
echo $(inputDeviceValue $1 "P: Phys=")
}
# arguments: device name
inputDeviceSysfs ()
{
echo $(inputDeviceValue $1 "S: Sysfs=")
}
# arguments: device name
inputDeviceHandlers ()
{
echo $(inputDeviceValue $1 "H: Handlers=")
}
# arguments: device name
inputDeviceEventHandlerPath ()
{
# constants
local INPUT_DEVICE_DIR_PATH="/dev/input/"
# get the handlers for the device (as a space delimited list)
# if nothing is found return error code 1 and don't echo anything
local handlers=$(inputDeviceHandlers $1)
if [ -z "${handlers}" ] ; then return 1; fi;
# interate through the list (splits on white space implictly)
for handler in ${handlers}
do
# if the handler starts with "event", then echo the path
# and return from the function successfully
case ${handler} in event*)
echo ${INPUT_DEVICE_DIR_PATH}${handler}
return
esac
done
# if no event handler was found, don't echo anything
# but (literally) return an error code
return 1
}
나는 그것을 독립 실행형 스크립트로 만들어 디렉토리에 input-device-info.sh
배치했습니다 /usr/bin
("올바른" 위치일 수도 있고 아닐 수도 있지만 제 사용 사례에서는 의미가 있는 것 같습니다).
그런 다음 다른 클라이언트 구현 스크립트에서 해당 스크립트를 가져와 다음 inputDeviceEventHandlerPath
과 같이 함수를 호출합니다.
. /usr/bin/input-device-info.sh
MY_DEVICE_PATH=$(inputDeviceEventHandlerPath "my-device-name")
echo 'MY_DEVICE_PATH:' ${MY_DEVICE_PATH}
답변3
인접한 답변에 있는 @BuvinJ의 코드 대신 더 작은 코드 조각을 원하는 경우:
#! /usr/bin/env bash
# Somewhat stolen from: <https://unix.stackexchange.com/a/507209>
# Problem: multiple devices with the same name
find_event() {
local lnNo handlers
local INFO_FILE='/proc/bus/input/devices'
lnNo=$(grep -n 'N: Name=' $INFO_FILE | grep "$1" | head -n1 | cut -d: -f1)
handlers="$(tail +"$lnNo" $INFO_FILE | grep 'H: Handlers=' | head -n1 | cut -d= -f2)"
[ -z "$handlers" ] && return 1
for handler in $handlers; do
case $handler in event*)
echo "/dev/input/$handler"
return 0
esac
done
return 1
}