![xdotool type 和 stty 有时会截断输入的第一个字母](https://linux22.com/image/146022/xdotool%20type%20%E5%92%8C%20stty%20%E6%9C%89%E6%97%B6%E4%BC%9A%E6%88%AA%E6%96%AD%E8%BE%93%E5%85%A5%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AF%8D.png)
我定义了一个简单的函数prepend
(如下),它应该自动在以下输入提示中放置 bash 命令的重复术语。例如,通过prepend git
在终端中键入,所有以下输入都应该已经git
输入。大多数情况下,prepend
这样做;然而,看似随机,prepend
将切断该单词的第一个字母(例如,在以下输入提示中$prepend sensors
产生)。$ensors
我想知道为什么会发生这种情况以及如何解决它。但是,如果有一种替代/规范的方式将文本输入到输入提示中,我不介意以不同的方式实现这一点。
#!/bin/bash
#stty to stop text from being displayed before $PS1
function prepend {
if ! [ -z "$1" ]
then
PROMPT_COMMAND="stty -echo && xdotool type $1 && stty echo"
set PROMPT_COMMAND
else
unset PROMPT_COMMAND
fi
}
答案1
我相信当已经按住该字符的键时,第一个字母就会被切断。要查看此效果,您可以在终端中运行以下命令:
$ xdotool type foof
如果您f
在按下之前松开该键Return
,则会进行打印foof
,但如果您在按住最后一个键f
的同时按下Return
该键,则会进行打印oof
。我相信发生这种情况是因为 xdotool 正在发送keydown
事件,当按键已经按下时,这些事件没有任何效果。
您可以通过手动发送事件来解决此问题keyup
:
$ xdotool keyup f type foof
将始终foof
正确打印。
就您而言,这会稍微复杂一些;您需要检测字符串的第一个字符才能发送正确的keyup
.但是,一旦您这样做了,这种方法也应该适合您。