2

単純な C プログラムに応答するスクリプトを作成しようとしています。スクリプトは、質問が見つかるまで、1 行ずつ読み取り、テキストを解析する必要があると思います。次に、同じ stdout に応答する必要があります。スクリプトは無限ループで読み込み、コマンドラインで開始します

./script.sh &

バックグラウンドで実行するためです。次に、同じ端末で、コマンドラインに出力し、scanf で待機する C プログラムを開始します。私の問題は、これらの 2 つのプロセスがお互いを「見る」ことができないため、別の stdout と対話しているように見えることです。明らかに私は何かを誤解しています...助けはありますか?

#!/bin/bash
for (( ; ; )) do
    while read line; do
        if [ "$line" == ">" ] then
        echo "yes"
        fi
    done
done    
4

2 に答える 2

2

期待するのはどうですか?Expect は、インタラクティブなアプリケーションにプログラムで応答するための Unix ツールであり、あなたのような問題を解決するのに非常に役立ちます。もちろん、bash スクリプトで使用することもできます。

問題に対する答えは次のようになります。

#!/bin/bash

expect << EOF
  spawn simple_c_application
  expect ">"
  send "yes\r"
  expect eof
EOF

スクリプトはアプリケーションを生成し、出力をチェックして、出力行>が含まれている場合はyesと応答します。また、expect パターンでアンカーを使用することもできます。文字は行頭と行末に一致します。そのため、行が正確に>の場合にのみ一致します。 ^$^>$

パッケージマネージャーからexpectをインストールしてから、いつものようにbashスクリプトを使用するだけです.

于 2012-10-23T19:46:13.870 に答える
1

mkfifoの代わりに、このソケットファイルから読み取ったスクリプトを使用してソケットファイルを作成しますstdin。Cプログラムから、でソケットを開き、openstdoutの代わりにこれに書き込みます。

例:

ターミナルでこれを入力して、ソケットファイルを作成します。

user~$ mkfifo mysocket

スクリプトを次のように変更します。

while :
do
    here=$(<mysocket)
    if [ "$here" == ">" ] then
        echo "yes"
    fi
done

そしてあなたのcファイルで

char* test = ">\n";
int mysocket = open("/home/user/mysocket","w");
int byteswrite = write(mysocket,(void*)test,2);

プログラムの最初と後にスクリプトを実行します

于 2012-10-23T19:57:16.167 に答える