Udev

Udev沒有在腳本中執行xinput命令

  • October 5, 2020

我正在努力做到這一點,以便當我連接外接滑鼠時,我可以自動重新映射按鈕。我可以手動重新映射按鈕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確實將輸出放在了輸出文件中。

我一直在看各種東西,比如這個編寫 udev 規則指南,我已經改變了所有對絕對路徑的呼叫,正如其他一些文章所建議的那樣,但我無法弄清楚。

我一直在尋找並在超級使用者 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 次,但這似乎不是問題。

引用自:https://unix.stackexchange.com/questions/612686