배경 정보:
내 노트북의 터치스크린에 문제가 있어서 이를 처리하기 위해 부팅 시 특별한 Bash 스크립트를 사용했지만 최근에는 GNU 권장 사항과 더욱 일치하도록 PureOS를 설치했습니다. 나는 Wayland 생태계에서 xinput에 원격으로 가까운 것을 찾는 것을 포기했지만 절대적으로 강요하지 않는 한 레거시 소프트웨어를 실행하는 것을 좋아하지 않습니다. 드라이버와 같은 방법과 libinput에서 제공하는 정보를 조작하는 것은 쓸모가 없습니다. 터치스크린의 거의 의사 무작위 동작을 중지한 유일한 명령은 Divine 이었습니다 evtest --grab
. 터치 스크린을 비활성화하지 않으면 업무용 노트북이 TTY를 제외하고 전혀 쓸모가 없다는 점을 강조하고 싶습니다.
중요한 부분:
스크립트를 만들려고 했는데요
- 입력 장치 목록을 검색합니다.
cat /proc/bus/input/devices
- 단락을 찾기 위해 출력을 구문 분석합니다
"ELAN0732:00 04F3:264C"
(사용해 보았지만awk
잘 이해가 안 됨). - 위의 것과 구별하십시오
"ELAN0732:00 04F3:264C Pen"
(이것은 두 개의 다른 장치입니다. 펜은 문제를 일으키지 않지만 필요하지 않으므로 이것에 대해서도 비활성화해도 상관 없습니다) - 해당 단락에서 재부팅할 때마다 N이 무작위로 지정되는 문을 찾으세요 ( /
eventN
사용 ).grep
awk
- 달리기
sudo evtest --grab /dev/input/event$N > /dev/null
그런 다음 부팅 시 루트 권한으로 실행될 위치에 이 스크립트를 배치합니다(이에 대해 본 적이 있지만 /etc/rc.local
아직 시도하지는 않았습니다).
evtest
이미 입력 장치를 한 줄로 인쇄했으며 이에 대한 변형을 함께 구성했습니다.
sudo timeout 2 evtest --grab | grep "ELAN073 | grep "ELAN0732:00 04F3:264C"
그러나 grep
올바르게 구문 분석되지는 않지만(아마도 stdout이 파이프되는 방식으로 인해) timeout
명령을 실행하고, 출력을 파이핑하고, 명령을 종료하고, 구문 분석하는 것보다 위의 단계에 따라 구문 분석하는 것이 더 나을 수 있습니다. 다시 실행해 보세요./proc/bus/input/devices
awk
추가 정보:
PureOS 9.0(Debian 테스트 기반), Linux 4.19.0-5-amd64
cat /proc/bus/input/devices
는 다음을 인쇄합니다.
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input0
U: Uniq=
H: Handlers=sysrq kbd leds event0
B: PROP=0
B: EV=120013
B: KEY=20000 20 0 0 1500f02100000 3803078f900d401 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input2
U: Uniq=
H: Handlers=kbd event1
B: PROP=0
B: EV=3
B: KEY=10000000000000 0
I: Bus=0019 Vendor=0000 Product=0005 Version=0000
N: Name="Lid Switch"
P: Phys=PNP0C0D/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input3
U: Uniq=
H: Handlers=event2
B: PROP=0
B: EV=21
B: SW=1
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input4
U: Uniq=
H: Handlers=kbd event3
B: PROP=0
B: EV=3
B: KEY=10000000000000 0
I: Bus=0019 Vendor=0000 Product=0006 Version=0000
N: Name="Video Bus"
P: Phys=LNXVIDEO/video/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:14/LNXVIDEO:02/input/input6
U: Uniq=
H: Handlers=kbd event4
B: PROP=0
B: EV=3
B: KEY=3e000b00000000 0 0 0
I: Bus=0011 Vendor=0002 Product=0007 Version=01a1
N: Name="SynPS/2 Synaptics TouchPad"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input5
U: Uniq=
H: Handlers=mouse2 event9
B: PROP=5
B: EV=b
B: KEY=e520 10000 0 0 0 0
B: ABS=660800011000003
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="HP Wireless hotkeys"
P: Phys=hpq6001/input0
S: Sysfs=/devices/virtual/input/input13
U: Uniq=
H: Handlers=kbd event10 rfkill
B: PROP=0
B: EV=3
B: KEY=80000000000000 0 0 0
I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/devices/platform/pcspkr/input/input14
U: Uniq=
H: Handlers=kbd event11
B: PROP=0
B: EV=40001
B: SND=6
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HD-Audio Generic HDMI/DP,pcm=3"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.1/sound/card0/input15
U: Uniq=
H: Handlers=event12
B: PROP=0
B: EV=21
B: SW=140
I: Bus=0003 Vendor=04f2 Product=b634 Version=0012
N: Name="HP Wide Vision FHD Camera: HP W"
P: Phys=usb-0000:03:00.4-1/button
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.4/usb3/3-1/3-1:1.0/input/input16
U: Uniq=
H: Handlers=kbd event13
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HD-Audio Generic Mic"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.6/sound/card1/input17
U: Uniq=
H: Handlers=event5
B: PROP=0
B: EV=21
B: SW=10
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="HP WMI hotkeys"
P: Phys=wmi/input0
S: Sysfs=/devices/virtual/input/input19
U: Uniq=
H: Handlers=kbd event6
B: PROP=0
B: EV=33
B: KEY=4000000000 0 1000700000000 2102400 0 0
B: MSC=10
B: SW=0
I: Bus=0003 Vendor=04f2 Product=b634 Version=0012
N: Name="HP Wide Vision FHD Camera: HP I"
P: Phys=usb-0000:03:00.4-1/button
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.4/usb3/3-1/3-1:1.2/input/input20
U: Uniq=
H: Handlers=kbd event14
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HD-Audio Generic Headphone"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.6/sound/card1/input18
U: Uniq=
H: Handlers=event7
B: PROP=0
B: EV=21
B: SW=4
# THIS IS THE PARAGRAPH I NEED
I: Bus=0018 Vendor=04f3 Product=264c Version=0100
N: Name="ELAN0732:00 04F3:264C"
P: Phys=i2c-ELAN0732:00
S: Sysfs=/devices/platform/AMDI0010:00/i2c-0/i2c-ELAN0732:00/0018:04F3:264C.0001/input/input21
U: Uniq=
H: Handlers=mouse0 event8 #THIS IS THE EVENT NUMBER I NEED
B: PROP=2
B: EV=1b
B: KEY=400 0 0 0 0 0
B: ABS=3273800000000003
B: MSC=20
# THIS PARAGRAPH SHOULD BE IGNORED, OR BOTH CAN BE USED, BUT NOT EXCLUSIVELY THIS ONE
I: Bus=0018 Vendor=04f3 Product=264c Version=0100
N: Name="ELAN0732:00 04F3:264C Pen"
P: Phys=i2c-ELAN0732:00
S: Sysfs=/devices/platform/AMDI0010:00/i2c-0/i2c-ELAN0732:00/0018:04F3:264C.0001/input/input24
U: Uniq=
H: Handlers=mouse1 event15
B: PROP=0
B: EV=1b
B: KEY=c03 0 0 0 0 0
B: ABS=1000003
B: MSC=10
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="BRLTTY 5.6 Linux Screen Driver Keyboard"
P: Phys=pid-692/brltty/14
S: Sysfs=/devices/virtual/input/input27
U: Uniq=
H: Handlers=sysrq kbd event16
B: PROP=0
B: EV=100003
B: KEY=402000007 ffc03078f800d2a9 f2beffdfffefffff fffffffffffffffe
I: Bus=0005 Vendor=045e Product=082f Version=0206
N: Name="Microsoft Bluetooth Mouse Mouse"
P: Phys=80:2B:F9:52:CA:DC
S: Sysfs=/devices/virtual/misc/uhid/0005:045E:082F.0002/input/input28
U: Uniq=DD:47:30:64:95:63
H: Handlers=mouse3 event17
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0
B: REL=143
B: MSC=10
I: Bus=0005 Vendor=045e Product=082f Version=0206
N: Name="Microsoft Bluetooth Mouse Keyboard"
P: Phys=80:2B:F9:52:CA:DC
S: Sysfs=/devices/virtual/misc/uhid/0005:045E:082F.0002/input/input29
U: Uniq=DD:47:30:64:95:63
H: Handlers=sysrq kbd event18
B: PROP=0
B: EV=100013
B: KEY=1000000000007 ff800000000007ff febeffdff3cfffff fffffffffffffffe
B: MSC=10
I: Bus=0005 Vendor=045e Product=082f Version=0206
N: Name="Microsoft Bluetooth Mouse"
P: Phys=80:2B:F9:52:CA:DC
S: Sysfs=/devices/virtual/misc/uhid/0005:045E:082F.0002/input/input30
U: Uniq=DD:47:30:64:95:63
H: Handlers=event19
B: PROP=0
B: EV=9
B: ABS=10000000000
I: Bus=0005 Vendor=0000 Product=0000 Version=0000
N: Name="00:0A:45:0A:FB:49"
P: Phys=
S: Sysfs=/devices/virtual/input/input33
U: Uniq=
H: Handlers=kbd event20
B: PROP=0
B: EV=100007
B: KEY=2fc800 145200000000 0 10300 49e800000c00 e16800000000f f810000010000ffc
B: REL=0
답변1
이는 적절한 awk 스크립트여야 합니다.
device=$( cat /proc/bus/input/devices |
awk '
/"ELAN0732:00 04F3:264C"/{ inside = 1 }
/Handlers=/ { if(match($0,"event([0-9]+)",group))event = group[1] }
/^$/ { if(inside && event!="")print "/dev/input/event" event
inside = 0; event = ""
}')
if [ -n "$device" ]
then sudo evtest --grab "$device" > /dev/null &
fi
첫 번째 줄은 필수 문자열과 일치하고 inside
올바른 섹션에 있음을 나타내는 변수를 설정합니다. 다음 줄에서는 정규식을 찾아서 Handlers
사용 하고 숫자를 배열로 캡처한 다음 변수를 설정합니다 .match(string, regexp, returnarray)
event[0-9]+
()
group
event
마지막으로 각 섹션 끝(마지막 섹션 포함)의 빈 줄을 일치시키고, 내부에 있고 이벤트 번호가 있으면 이벤트 번호에 연결된 장치 경로를 인쇄합니다.
awk가 GNU가 아닌 POSIX인 경우 Handlers 줄을 다음으로 바꾸세요.
/Handlers=/{ if(split($0,part,"event"))event = part[2]+0 }
"event"라는 단어에서 줄을 분할한 후 다음 문자를 숫자로 변환합니다.
위 스크립트를 직접 작성한 경우 /etc/rc.local
반드시 실행해 주시고 sudo chmod +x /etc/rc.local
, 그렇지 않으면 실행되지 않습니다.
Systemd가 시작 시 중단되지 않도록 하려면 명령의 끝 부분이 &
필요합니다(계속하기 전에 종료할 것으로 예상하고 전체 가동 시간 동안 실행해야 하기 때문입니다). 메모리를 절약하기 위해 터치 스크린 사용을 보고하는 데 사용되는 표준 출력을 /dev/null
무시 하십시오 . evtest
추가는 /dev/null
사소할 수 있지만 해를 끼치지는 않습니다.
답변2
오. 이 질문에 대해 정말 감사드립니다. 실제로 터치 스크린을 비활성화하는 방법에 대한 답변을 얻었습니다. 내 것은 괜찮았지만 갑자기 매우 탄도가 되어 화면의 모든 것을 계속 클릭했습니다.
수용된 솔루션은 훌륭하고 멋지지만 실제로 이해할 수 있는 매우 기본적인 솔루션을 원합니다. 따라서 일반 쉘의 경우 다음과 같습니다.
sudo evtest --grab /dev/input/$(grep "SYNA2393" -A 5 /proc/bus/input/devices | grep "Handlers=" | cut -d" " -f 3)
이는 허용되는 솔루션보다 취약하므로 독자들이 하드 코딩을 좋아하지 않는 한 이를 사용하는 것이 좋습니다.
답변3
우분투 22.04를 새로 설치하고 있습니다. awk의 일치 기능을 작동시키는 방법을 몰랐기 때문에 @meuh 및 @JinnKo의 코드를 사용하여 키워드가 지정된 여러 장치를 비활성화/전환할 수 있는 awk가 아닌 버전을 만들었습니다.
먼저 evtest가 설치되어 있는지 확인하세요.
sudo apt install evtest
두 개의 파일이 있습니다. 하나는 터치 스크린을 켜고 끄는 것이고 다른 하나는 시작 시 항상 비활성화하는 것입니다.
터치스크린 전환:
#!/bin/bash
# This toggles my touchscreen
#search for "Touchscreen" or something like that in /proc/bus/input/devices to make sure you're disabling what you want to disable.
path_for_temp_files="/ANY_PATH_YOU_WANT_TO_STORE_SOME_PID_FILES/"
regex='event([0-9]+)'
DEVICE="Touchscreen"
if [ -r "${path_for_temp_files}touchscreen-evtest0.pid" ]; then
kill_these_files=("${path_for_temp_files}"touchscreen-evtest*)
for i in "${kill_these_files[@]}"; do
echo "kill" $(cat "${i}")
sudo kill $(cat "${i}")
sudo rm "${i}"
done
else
filename='/proc/bus/input/devices'
inside=0
events=()
while read line; do
if [[ $line =~ $DEVICE ]]; then
inside=1
fi
if [[ $line =~ $regex ]]; then
if [[ "$inside" -eq 1 ]]; then
events+=("${BASH_REMATCH[1]}")
fi
inside=0
fi
done < $filename
numevents=${#events[@]}
for (( i=0; i<${numevents}; i++ )); do
sudo evtest --grab "/dev/input/event${events[$i]}" > /dev/null &
pid=$!
echo $pid > "${path_for_temp_files}touchscreen-evtest${i}.pid"
echo "/dev/input/event${events[$i]} running on pid ${pid}"
done
fi
시작 시 터치스크린 실행을 비활성화합니다.
#!/bin/bash
# This disables my touchscreen
#search for "Touchscreen" or something like that in /proc/bus/input/devices to make sure you're disabling what you want to disable.
path_for_temp_files="/ANY_PATH_YOU_WANT_TO_STORE_SOME_PID_FILES/"
regex='event([0-9]+)'
DEVICE="Touchscreen"
if [ -r "${path_for_temp_files}touchscreen-evtest0.pid" ]; then
kill_these_files=("${path_for_temp_files}"touchscreen-evtest*)
for i in "${kill_these_files[@]}"; do
echo "kill" $(cat "${i}")
sudo kill $(cat "${i}")
sudo rm "${i}"
done
fi
filename='/proc/bus/input/devices'
inside=0
events=()
while read line; do
if [[ $line =~ $DEVICE ]]; then
inside=1
fi
if [[ $line =~ $regex ]]; then
if [[ "$inside" -eq 1 ]]; then
events+=("${BASH_REMATCH[1]}")
fi
inside=0
fi
done < $filename
numevents=${#events[@]}
for (( i=0; i<${numevents}; i++ )); do
sudo evtest --grab "/dev/input/event${events[$i]}" > /dev/null &
pid=$!
echo $pid > "${path_for_temp_files}touchscreen-evtest${i}.pid"
echo "/dev/input/event${events[$i]} running on pid ${pid}"
done
그럼 나도 따라갈게이 답변시작 시 루트로 실행