Bashでシミュレートされたキーストロークを送信する


19

最近、bashでc ++プログラム自動化するために使用できるスクリプトを作成しようとしています。AutoItを知っているなら、私がやろうとしていることの例を簡単に示すことができます。

send("1{enter}")

または

send("!a")

OK AutoItを話さない人のために:

最初の例では、シミュレートされた「1」キーストロークに続いてenter(CR)を送信します

2番目の例は、alt-aを送信します

私は特にこれをbashでやろうとしています。他のスクリプト言語は何もしません

また、私はスプーンフィードを好まないでしょう。書き方を指定してください。私のためにスクリプトを書くことは許可されていません。


1
コマンドライン、ncurses、またはグラフィカルプログラムを自動化していますか?
user1686

1
今のところ、コマンドラインを自動化しています。それは自動的にCINの(コンソール入力)にフィード入力になっている
イシャン

回答:


16

プログラムの標準入力にテキストを入力するには、パイプまたはリダイレクト、あるいはその両方を使用します。

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

インタラクティブCLIプログラム(のケースではない完全な末端のもの)、名前付きパイプまたは使用することが可能であるcoprocessesを貧乏人の一種として、expect(あなたが原因のTclであることに除外されました):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(出力パイプから読み込むときは注意してください。たとえば、head -1 <out1行だけを読み込むのではなく、1つの完全な4kブロックをバッファリングし、1行を印刷し、残りを破棄します。)


どちらの答えも同様に良いです。しかし、これは私が探しているものです。
イシャン

CLIプログラム/フルターミナルとはどういう意味ですか?
クリスストライチンスキー

CLIはコマンドラインインターフェイスの略です。CLIプログラムは、コマンドラインで実行される単純なプログラムであり、通常はタスクを実行し、実行を終了してコマンドラインプロンプトに戻るときにstdinとstdoutを使用します。grepそしてcurlこの良い例です。完全なターミナルプログラムは、vimやなどのウィンドウ全体を制御するものですscreen
トレビンエイヴリー

16

xdotoolを探しています

サンプルコマンドに相当するxdotoolの機能は次のとおりです。

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

これはいい。しかし、私はいくつかの純粋なbashコードについて考えていました
イシャン

9
@Ishan:純粋なbashコードでそのようなことを行うことは事実上不可能です。BashはX11を直接使用できず、既存のX11ライブラリも使用できません。X11ソケットに直接接続し(bashはTCPのみを実行し、Unixソケットは接続しない)、X11プロトコルを手動で解析し(bashのバイナリデータの解析は失敗する予定です)、適切な応答を作成する必要があります。bashはシェルであり、外部ツールを連鎖せることで動作するように設計されています。
user1686
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.