我有一个(只读)可执行文件“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 /退出/终止?
答案 0 :(得分:5)
您可以使用expect自动执行此操作。例如:
#!/usr/bin/expect
spawn /my/exec
expect "> "
send "input1\r"
interact
答案 1 :(得分:5)
您可以使用cat
:
$ { echo "input1"; cat; } | my exec
答案 2 :(得分:0)
您可以创建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 ~]#
答案 3 :(得分: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为空,它将等待。