質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

4053閲覧

シェルスクリプトでexpect関数を使用した自動入力について

himuru

総合スコア12

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2019/04/29 13:41

シェルスクリプトでexpect関数を使用して、コマンドの実行後の自動入力をしたいと考えています。

x nn というコマンドを入力すると、以下の文章が出てきますので、2と自動入力するためにスクリプトを作成してみました。

以下、コマンドを実行した際の文章
specify nn-bondlength factor: (usually=2) [and optionally dlimit, dstmax (about
1.d-5, 20)]

以下、作成したスクリプト

#!/bin/sh command_nn="x nn" answer_nn=2 ### x nn expect -c " set timeout 5 spawn ${command_nn} expect \"20)]\" send \"${answer_nn}\n\" "

このスクリプトを実行した際、2と自動入力されず、タイムアウトしてしまいます。

色々なサイトを見て解決を試みてみたのですが、どれもうまくいかず、自分の力ではどうにもできません。

ぜひ、お知恵を貸していただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/04/29 16:29

実行結果を追記してください。
himuru

2019/04/29 18:14

早速の返信、ありがとうございます。また、情報不足で申し訳ありません。 以下が実行の結果になります。 [XXXXX]$ ./Test.sh spawn x nn specify nn-bondlength factor: (usually=2) [and optionally dlimit, dstmax (about 1.d-5, 20)] [XXXXX]$ 期待する動作としては、expect関数の利用により、2と入力され、エンターが押される、動作ですが、このような動作はしておりません。 コマンドでx nnを入力した際は、以下の動作をしております。 [XXXXX]$ x nn specify nn-bondlength factor: (usually=2) [and optionally dlimit, dstmax (about 1.d-5, 20)] 2 NN ENDS 0.001u 0.007s 0:01.31 0.0% 0+0k 0+56io 0pf+0w [XXXXX]$ と表示され、複数ファイルが作成されます。
guest

回答1

0

ベストアンサー

出力を見る限り、単に、expectの終了によってspawnした子プロセスが終了しただけのように見えます。

sh

1expect -c " 2set timeout 5 3spawn ${command_nn} 4expect \"20)]\" 5send \"${answer_nn}\n\" 6expect 7"

と、最後にexpectを入れてみてください。

投稿2019/04/29 23:40

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

himuru

2019/04/30 17:19

otn様 早速の回答、大変、感謝いたします。 otn様のご提案の通り、最後にexpectを入力したところ、期待通りの動作を致しました。 今回の迅速な対応、大変、感謝いたします。
otn

2019/04/30 17:31

オペランド無しのexpectで、spawnしたプログラムの終了(厳密にはちょっと違うが)か、タイムアウトかを待ちます。 これでうまくいったと言うことは、 > タイムアウトしてしまいます。 という判断が間違っていたわけです。主観の判断結果でなく客観的な事実を書くと解決が早いです。
himuru

2019/05/12 07:45

otn様 返信が遅れてしまい、大変、申し訳ございません。 主観的な判断をしたことにより、混乱を招いてしまい、反省しております。今後、きちんと主観的な判断をできるように勉強を積み上げていくように努力いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問