我想要在 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 i
和read -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