在脚本中使用 xdotool 输入 gedit

在脚本中使用 xdotool 输入 gedit

我想要在 shell 中输入一个字符,并将xdotool该字符的信号发送给 gedit,以便该字符可以在 gedit 中输入。

我已经写了这个脚本:

#!/bin/bash
gedit -s &
GEDPID=$!
sleep 2s
GEDWINID=`xdotool search --pid $GEDPID | tail -1`
echo "press any keys"
read i
xdotool windowactivate --sync $GEDWINID key --clearmodifiers --delay 100 "$i" && wmctrl -a Terminal

除了脚本等待enter向 gedit 发送键盘信号外,一切运行良好。

因此我将read i其改为read -n1 i,以使脚本无需输入即可完成其工作。

#!/bin/bash
gedit -s &
GEDPID=$!
sleep 2s
GEDWINID=`xdotool search --pid $GEDPID | tail -1`
echo "press any keys"
read -n1 i
xdotool windowactivate --sync $GEDWINID key --clearmodifiers --delay 100 "$i" && wmctrl -a Terminal

但它没有在 gedit 中输入任何字符!

那么问题来了,第二个脚本的问题是什么?read iread -n1 i有什么区别导致了这个问题?

答案1

我能够重现这个问题。虽然我不知道为什么read和之间会有区别read -n1,但在按键前添加一个简单的延迟就可以让它工作。我猜是因为窗口切换后没有足够的时间来记录按键。

#!/bin/bash
gedit -s &
GEDPID=$!
sleep 2s
GEDWINID=`xdotool search --pid $GEDPID | tail -1`
echo "press any keys"
read -n1 i
xdotool sleep 0.1 windowactivate --sync $GEDWINID key --clearmodifiers --delay 100 "$i" && wmctrl -a Terminal

答案2

我修改了您的原始脚本,以便它能够正确获取当前终端的窗口 ID,并在终端和 Gedit 窗口之间切换焦点。此脚本使用无限循环,因此在终端窗口中打印的所有击键都会传输到 Gedit 中。使用Ctrl+取消它C

#!/bin/bash

WIDGTERM=$(xdotool getactivewindow)
gedit -s 2> /dev/null &
sleep 2s
WIDGEDIT=$(xdotool getactivewindow)
xdotool windowactivate $WIDGTERM
echo "Press any keys"
while true
do
  read -n1 i
  xdotool windowactivate --sync $WIDGEDIT key --clearmodifiers "$i"
  sleep .5
  xdotool windowactivate --sync $WIDGTERM
done

相关内容