10

(読み取り専用の)実行可能ファイル「myexec」があり、これに続いて入力「input1」(文字列)を実行します。その後、ビジネス「」と「exit」に進みます。

$ myexec
> input1
> do something else for as long as I like
> exit

私がやりたいのは、入力「input1」で「myexec」を自動的に実行し、「好きなだけ他のことをする」ことができるようにすることです。私が見ることができるものから、私のオプションは次のとおりです。

$ myexec <<< "input1"

また

$ echo "input1" | myexec

また

$ myexec << EOF
input1
EOF

しかし、これらのメソッドの問題は、「input1」を読み取った後に「myexec」を終了することです。EOF /終了/終了を回避するにはどうすればよいですか?

4

4 に答える 4

6

これに使用できますcat

$ { echo "input1"; cat; } | my exec
于 2013-03-25T16:42:44.550 に答える
5

あなたはそれを自動化するためにを使うことができます。例えば:

#!/usr/bin/expect

spawn /my/exec
expect "> "
send "input1\r"
interact
于 2013-03-25T14:50:35.603 に答える
1

を作成しpipeて入力をリッスンできますtail -f

mkfifo pipe
tail -f pipe | ./script.sh

script.shのコンテンツ例

#!/bin/bash

while read row
do
    if [ "${row}" = "exit" ]; then
        break
    fi
    echo "ROW READ $row"
done

echo "script exit"
exit 0

次に、別のスクリプトを使用して、パイプにフィードします

echo "example content" > ./pipe
echo "bla bla bla" > ./pipe
echo "exit" > ./pipe
echo "" > ./pipe

あなたが得るでしょう

[root@mypc ~]# tail -f pipe | ./script
ROW READ example content
ROW READ bla bla bla
script exit
[root@mypc ~]#
于 2013-03-25T14:50:56.187 に答える
0

ファイルシステムに保存されている名前付きパイプであるFIFOが必要なようです。リダイレクトする出力は、リッスンしているものの反対側に出力されます。これを試して:

mkfifo myexec.fifo
myexec < myexec.fifo &
echo input1 > myexec.fifo
echo input2 > myexec.fifo

以下の例では、bashを使用して、fifoに送信されるコマンドを実行することでこれをテストできます。

mkfifo bash.fifo
/bin/bash < bash.fifo &
echo uname > bash.fifo
Darwin

アンパサンドはプロセスをバックグラウンドにデタッチします。myexecがリッスンし続ける限り、コマンドを実行し続けます。

myexecが終了している場合は、whileループでラップできます。

while [ 1 ]; do myexec < myexec.fifo; done

myexecは、FIFOで待機している内容を消費した後、ループを繰り返します。FIFOが空の場合、待機します。

于 2013-03-25T15:01:28.533 に答える