10

我有一个(只读)可执行文件“myexec”,我总是执行它,然后输入“input1”(一个字符串),然后在我喜欢的时候继续我的业务“”和“退出”:

$ 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 回答