在 Linux 上,如何使用 POSIX shell 禁用鼠标一秒钟,而不是等待第二个并立即做一些工作?
On Linux, how to disable mouse for a second using POSIX shell, without waiting for the second and do some job immediately?
TL;DR:在 Linux 上,如何使用 POSIX shell 禁用鼠标一秒钟,而无需等待第二个并立即做一些工作?
OS:Linux Mint 18.3 64 位 Cinnamon,带 LightDM 显示管理器和 Mutter (Muffin) window 管理器,X11 windowing 系统。
脚本环境:dash
.
我需要:
做点什么(为了这个问题的目的究竟是什么并不重要,但你可以阅读the full script on Core Review)。
暂时禁用鼠标。但剧本必须继续。这个很重要。
运行 立即申请(Lightshot 在一般打印屏幕模式下)。
基本原理:由于Lightshot可能包含一个错误,鼠标不能在打印屏幕之前移动,否则通常会导致类似这个:
TL;DR
假设,在我的系统上,鼠标设备 ID 等于 12。然后在 POSIX shell 脚本中执行该技巧的函数如下所示:
my_mouse_device_id=12
disable_mouse_for_a_second()
{
if xinput --disable "" 2> /dev/null
then
(
sleep 1s
xinput --enable ""
) &
return 0
else
return 1
fi
}
# example usage
if disable_mouse_for_a_second "$my_mouse_device_id"
then
echo "Success"
else
echo "Failure"
fi
说来话长
您需要使用以下方法找到鼠标设备 ID:
xinput list --short
This thread 对我帮助很大,例如以下内容已弃用:
xinput --set-int-prop
之后我们需要运行这两个命令:
sleep 1s
xinput --enable "$my_mouse_device_id"
棘手的部分是我们需要:
- 一个 subshell
(
... )
- 后台作业
&
让它正常工作。
从实际的角度来看,我们需要做的就是将它包装在一个漂亮的函数中。
我在 OP 的回答中添加了一些信号处理,所以这里是:
#!/bin/sh
my_mouse_device_id=12
disable_mouse_for_a_second()
{
if xinput --disable "" 2> /dev/null
then
(
# ensure the device will not be left disabled
id=
trap 'xinput --enable "$id"; trap - EXIT; exit' \
EXIT TERM INT HUP
sleep 1s
) &
return 0
else
return 1
fi
}
# example usage
if disable_mouse_for_a_second "$my_mouse_device_id"
then
echo "Success"
else
echo "Failure"
fi
请注意 {
... }
似乎可以替代 (
... )
在这里,如果您愿意的话,但是会有分shell 反正.
你必须将 </code> 存储在一个变量中(这里是 <code>id
),否则至少 Dash shell 在退出时不会知道它。
我参考了 this answer 信号处理。
TL;DR:在 Linux 上,如何使用 POSIX shell 禁用鼠标一秒钟,而无需等待第二个并立即做一些工作?
OS:Linux Mint 18.3 64 位 Cinnamon,带 LightDM 显示管理器和 Mutter (Muffin) window 管理器,X11 windowing 系统。
脚本环境:dash
.
我需要:
做点什么(为了这个问题的目的究竟是什么并不重要,但你可以阅读the full script on Core Review)。
暂时禁用鼠标。但剧本必须继续。这个很重要。
运行 立即申请(Lightshot 在一般打印屏幕模式下)。
基本原理:由于Lightshot可能包含一个错误,鼠标不能在打印屏幕之前移动,否则通常会导致类似这个:
TL;DR
假设,在我的系统上,鼠标设备 ID 等于 12。然后在 POSIX shell 脚本中执行该技巧的函数如下所示:
my_mouse_device_id=12
disable_mouse_for_a_second()
{
if xinput --disable "" 2> /dev/null
then
(
sleep 1s
xinput --enable ""
) &
return 0
else
return 1
fi
}
# example usage
if disable_mouse_for_a_second "$my_mouse_device_id"
then
echo "Success"
else
echo "Failure"
fi
说来话长
您需要使用以下方法找到鼠标设备 ID:
xinput list --short
This thread 对我帮助很大,例如以下内容已弃用:
xinput --set-int-prop
之后我们需要运行这两个命令:
sleep 1s xinput --enable "$my_mouse_device_id"
棘手的部分是我们需要:
- 一个 subshell
(
...)
- 后台作业
&
让它正常工作。
- 一个 subshell
从实际的角度来看,我们需要做的就是将它包装在一个漂亮的函数中。
我在 OP 的回答中添加了一些信号处理,所以这里是:
#!/bin/sh
my_mouse_device_id=12
disable_mouse_for_a_second()
{
if xinput --disable "" 2> /dev/null
then
(
# ensure the device will not be left disabled
id=
trap 'xinput --enable "$id"; trap - EXIT; exit' \
EXIT TERM INT HUP
sleep 1s
) &
return 0
else
return 1
fi
}
# example usage
if disable_mouse_for_a_second "$my_mouse_device_id"
then
echo "Success"
else
echo "Failure"
fi
请注意 {
... }
似乎可以替代 (
... )
在这里,如果您愿意的话,但是会有分shell 反正.
你必须将 </code> 存储在一个变量中(这里是 <code>id
),否则至少 Dash shell 在退出时不会知道它。
我参考了 this answer 信号处理。