web-dev-qa-db-ja.com

スクリプトでxdotoolを使用してgeditを入力します

シェルに文字を入力し、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 iread -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には文字を入力しません!

ここに質問があります。2番目のスクリプトの問題は何ですか?この問題を引き起こすread iread -n1 iの違いは何ですか?

3
Ali Razmdideh

この問題を再現できました。 readread -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
1
Evan Chen

元のスクリプトを修正して、現在のターミナルのウィンドウ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
0
whtyger