プログラムを起動してキー入力を送信するスクリプトを作成したいと思います。疑似スクリプト:
#!/bin/bash
./program << (PRESS CONTROL-Z)
プログラムは実行中なので、スクリプトに追加のコマンドがあった場合、control-zがプログラムを終了しない限り、それらのコマンドには到達しません。
これは可能ですか?私が見つけたものから、それはキーコードを必要とするかもしれないと思いましたが、私は間違っている可能性があります。
これは、ネイティブのbashスクリプトで実行できるため、「expect」よりもおそらく優れたソリューションだと思います。あなたの考えを見てみたいと思います。
使用する
`printf "character code here"`
バックティックに注意してください
たとえば、リモートのgnu screenセッションを制御するスクリプトを作成した場合、次の行でウィンドウ2が開き、ctrl-cキーコンボが発行されます。
ssh -t user@$host screen -p 2 -X stuff `printf "\003"`
コードの完全なリファレンスについては、ここを参照してください。
いくつかのキー入力のコードを見つけるには、次を使用できます
printf "%#x\n" "'X"
0x58
上記のASCIIコードリファレンスでは、キャリッジリターンとして0x13がリストされていますが、画面のマニュアルでは、Enterキーコードとして0x15がリストされていますが、その理由を知っている人はいますか?ローカル画面でテストし、Enterキーを押すと0x13が生成されますが、ssh経由でリモート画面にコマンドを送信すると0x13は機能しませんが、0x15は機能します。
お役に立てば幸い
桟橋
あなたが探しているかもしれませんexpect
(http://expect.nist.gov/から)。expect
これは、スクリプト(このシナリオではプログラム)からの入力が端末からのものであるようにプログラムに見せかける、疑似ttyの複雑さを扱います。
echo
または、その出力を使用するかcat
、プログラムにパイプすることができる場合があります。これはプログラムによって異なります。
プログラムをバックグラウンドで開始したいだけの場合は、
#!/bin/bash
./program&
プログラムをバックグラウンドで実行することが目的の場合は、次を使用します。
./program & # The & sends the command to the background
echo commands here are executed while program is in the background
…
wait # Wait for the completion of background commands
echo commands here are executed after background program has completed
編集:プログラムを停止することが目的の場合(ctrl-Zが* nixシェルでよく行うように)、STOP信号を送信できます。
kill -STOP pid
実行を再開するには、CONTシグナルを送信します。
kill -CONT pid
これらの各例pid
には、プログラムのプロセスIDがあります。スクリプトで起動すると、変数を使用して簡単に取得できます$!
。たとえば、
./prog &
echo prog started in the background
pid_of_prog=$!
kill -STOP $pid_of_prog
echo prog stopped
kill -CONT $pid_of_prog
echo prog continues
wait
echo prog finished
編集2:プログラムがctrl-Z文字を受け取ったときに終了するプログラムである場合、制御文字にはアルファベットの位置文字の数値があることに注意してください(つまり、Ctrl-Aは1、Ctrl-Bは2です)。等。)。このキャラクターをプログラムに送信するには、次のことができます。
echo -e "\032" | ./prog
(032
は26、つまり^ Z、8進数です。もちろん、同じ文字を任意の方法で生成できます。おそらく、。のような他の入力の最後に追加します( cat inputfile ; echo -e "\032" ) | ./prog
。
しかし、これは必ずしも機能するとは限りません。プログラムは、入力からこの文字を認識するように設計されている必要があります(おそらく認識されません)。通常、シェルがそれをキャッチします。繰り返しになりますが、入力を読み取るほとんどのプログラムstdin
は、入力が終了すると終了するだけなので、有限の入力(でも</dev/null
)をリダイレクトすると、入力が終了するはずです。
そして最後に、他のイベント(スクリプトの他の場所で検出された)が発生したときにプログラムの実行を停止することが目的である場合は、それだけkill
で済みます…</ p>