Udev
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
確實將輸出放在了輸出文件中。我一直在看各種東西,比如這個編寫 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 次,但這似乎不是問題。