Udev가 스크립트 내에서 xinput 명령을 실행하지 않습니다.

Udev가 스크립트 내에서 xinput 명령을 실행하지 않습니다.

외부마우스를 연결하면 자동으로 버튼을 리매핑할 수 있도록 만들어보려고 합니다. 버튼을 수동으로 다시 매핑할 수 있나요?xinput set-button-map $mouse_id $button_map

그러나 이것을 자동화하는 데 문제가 있습니다. 현재 장치가 연결될 때 udev가 스크립트를 실행하도록 하려고 합니다. 나는 다음과 같은 규칙을 가지고 있습니다 /etc/udev/rules.d/my_rule.rules.

ATTRS{idVendor}=="dummy", ATTRS{idProduct}=="dummy", RUN+="/bin/bash /path/to/my_script.sh"

다음과 같습니다 my_script.sh.

#!/bin/bash
out_file=/path/to/out.txt
mouse_id=dummy
button_map=dummy
# button map before
/usr/bin/xinput get-button-map $mouse_id >> $out_file
/usr/bin/xinput set-button-map $mouse_id $button_map
# button map after
/usr/bin/xinput get-button-map $mouse_id >> $out_file

터미널에서 스크립트를 호출하면 스크립트가 예상대로 정확하게 실행되지만 문제는 udev bash 환경에서 xinput이 전혀 실행되지 않는다는 것입니다. 세 번의 호출 중 아무 것도 수행되지 않았습니다. 그런 것조차도 /usr/bin/xinput >> $out_file도움이 되지 않습니다. 그러나 유사한 작업은 echo foobar >> $out_file출력을 out 파일에 넣습니다.

이것저것 다양하게 찾아봤는데udev 규칙 작성 가이드다른 게시물에서 제안한 대로 절대 경로에 대한 다양한 호출을 모두 변경했지만 이해할 수 없습니다.

답변1

계속 찾아보고 찾았어요이 게시물수퍼유저 stackexchange에서는 xinput이 DISPLAY 및 XAUTHORITY 환경 변수를 설정해야 한다고 말했고, 스크립트를 수정할 수 있었고 작동했습니다! 그러나 절전 모드를 추가하고 백그라운드에서 실행되도록 해야 했습니다. 내 최종 스크립트는 다음과 같습니다.

my_rule.rules:

ATTRS{idVendor}=="dummy", ATTRS{idProduct}=="dummy", ACTION=="add", RUN+="/path/to/my_sript.sh"

my_script.sh:

#!/usr/bin/bash
out_file=/path/to/out.txt
# run normal if given argument, start new in background else
if [[ $1 ]]
then
    sleep 1
    mouse_id="my_mouse's_id"
    xenv="env DISPLAY=:0 XAUTHORITY=/home/my_name/.Xauthority"
    # button map before
    $xenv /usr/bin/xinput get-button-map "$mouse_id" >> $out_file
    $xenv /usr/bin/xinput set-button-map "$mouse_id" 2 3 2 4 5 6 7 1 9
    # button map after
    $xenv /usr/bin/xinput get-button-map "$mouse_id" >> $out_file
    echo finished >> $out_file
else
    echo running > $out_file
    # run it, but detached in the background
    /path/to/my_script.sh run_normal & 
fi

또한 마우스를 연결할 때 udev가 스크립트를 18번 호출한다는 점을 다른 사람들에게 지적하고 싶었지만 그게 문제가 아닌 것 같습니다.

관련 정보