我从脚本文件执行一个应用程序,并从此处的文档将 stdin 重定向到它,如下所示:
my_cli << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC
这按预期工作,但我既看不到输入也看不到应用程序输出。该应用程序是一个用 C 编写的交互式提示。当我手动与其交互时,我可以看到提示本身以及对我输入的响应,但当我执行上述脚本时,我什么也看不到。我希望它打印输入和输出,就像真实用户正在输入一样。你知道该怎么做吗?
答案1
似乎应该有更好的方法,但您可以使用包装函数:
wrapper () { local text=$(</dev/stdin); echo "$text"; my_cli <<<"$text"; }
wrapper << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC
逐行处理此处的文档:
wrapper2 () { local line; while read -r line; do echo "$line"; my_cli <<<"$line"; done; }
如果您手动与程序交互,它会显示输出吗?它会输出到 stdout 还是 stderr?
另一个可能对你有用的选项是expect
。
答案2
我看到了 Perl!
嗯,如果您使用 qx 或系统调用,您就无法做到这一点,因为它们本质上是阻塞的(是的,您可以执行 system("program &") 或从另一个线程调用它并将其分离。
启动器线程:
threads->create( sub {
threads->self->detach();
qx"$cmd > file1.cmd";
});
主要代码::
threads->create( sub {
while (1) {
get file size, if it is bigger than second ago - read new line, increase size
parse new line, if any?
sleep 1;
}
} );
更好的,
use POE::Wheel::FollowTail
另一个解决方案是将每个程序的输出重定向到名为 fifo 并从程序中读取它们全部,同时留意新行。
man mkfifo
答案3
(tee /dev/fd/42 | mycmd) 42>&1 <<EOF
blah
blah
EOF
看起来不会确切地像一个真正的用户一样 - 所有输入都会被立即打印。expect
这可能更好。