调用交互式下标并将其输出保存到variables中

我目前有一个Perl脚本(我不能编辑),询问用户几个问题,然后将生成的输出打印到标准输出。 我想创build另一个脚本来调用这个脚本,允许用户像平常一样与之交互,然后把stdout的输出存储到一个variables中。

这是我想要完成的一个非常简单的例子:

inner.pl

#!/usr/bin/perl print "Enter a number:"; $reply = <>; print "$reply"; 

outer.sh (根据Op De Cirkel 在这里的答案)

 #!/bin/bash echo "Calling inner.pl" exec 5>&1 OUTPUT=$(./inner.pl | tee >(cat - >&5)) echo "Retrieved output: $OUTPUT" 

期望的输出:

 $ ./outer.sh Calling inner.pl Enter a number: 7 7 Retrieved output: 7 

然而,当我尝试这个时,脚本会在“挂起”之前输出Calling inner.pl ,而不从inner.sh中打印任何内容。

我已经find了一些解决方法,使用script命令将整个inner.sh交换存储到一个临时文件,然后使用sed等来修改它以满足我的需要。 但是为这样一些相当琐碎的东西创build临时文件并没有什么意义(更不用说script喜欢在所有内容上添加时间戳和\r s)。 有没有非script方式来完成这个?

答案比这个简单。 只需使用$()将内部输出重定向到一个变量:

 #!/bin/bash echo "Calling inner.sh" OUTPUT=$(./inner.sh) echo "Retrieved output: $OUTPUT" 

编辑:

现在,如果用户与inner.sh的输出inner.sh (例如inner.sh询问用户输入一个数字,则打印任何操作并要求用户输入基于该打印结果的新值)。 那么更好的是这样一个临时文件:

 #!/bin/bash echo "Calling inner.sh" TMPFILE=`mktemp` ./inner.sh | tee "$TMPFILE" OUTPUT=$(cat "$TMPFILE") rm "$TMPFILE" echo "Retrieved output: $OUTPUT"