管道到可执行文件而不在bash中退出/ EOF

时间:2013-03-25 14:27:30

标签: bash sh

我有一个(只读)可执行文件“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 个答案:

答案 0 :(得分:5)

您可以使用自动执行此操作。例如:

#!/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为空,它将等待。