调用交互式下标并将其输出保存到变量

时间:2016-11-22 22:40:27

标签: linux bash shell

我目前有一个Perl脚本(我无法编辑)向用户询问几个问题,然后将生成的输出打印到stdout。我想创建另一个调用此脚本的脚本,允许用户正常与它进行交互,然后将stdout的输出存储到变量中。

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

inner.pl

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

outer.sh (根据Op De Cirkel的回答here

#!/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打印任何内容。

通过使用script命令将整个inner.sh交换存储到临时文件,然后使用sed等将其修改为my,我找到了一些解决方法需要。但是为某些相当简单的事情制作临时文件并没有多大意义(更不用说script喜欢为所有内容添加时间戳和\r。是否有任何非script方法可以实现这一目标?

1 个答案:

答案 0 :(得分:1)

答案比这简单。只需将内部输出重定向到带有$()的变量:

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

编辑:

现在,如果用户与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"