我目前有一个Perl脚本(我无法编辑),它问用户几个问题,然后将生成的输出打印到stdout。我想制作另一个脚本来调用此脚本,允许用户正常与之交互,然后将 stdout 的输出存储到变量中。
下面是我想要完成的一个非常简单的示例:
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 打印任何内容。
通过使用script
命令将整个 inner.sh 交换存储到临时文件,然后使用sed
等根据我的需要对其进行修改,我找到了一点解决方法。但是为这样相当琐碎的事情制作临时文件并没有多大意义(更不用说script
喜欢为所有内容添加时间戳和r
)。有没有非script
的方法来实现这一点?
答案比这更简单。只需将 inner 的输出重定向到 $() 的变量:
#!/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"