如何回显重定向的标准输入

如何回显重定向的标准输入

我从脚本文件执行一个应用程序,并从此处的文档将 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这可能更好。

相关内容