Linux 调用交互式下标并将其输出保存到变量
我目前有一个Perl脚本(我无法编辑),它向用户询问一些问题,然后将生成的输出打印到stdout。我想创建另一个脚本来调用这个脚本,允许用户正常地与它交互,然后将stdout的输出存储到一个变量中 下面是一个非常简单的例子,说明我正在努力实现的目标: internal.plLinux 调用交互式下标并将其输出保存到变量,linux,bash,shell,Linux,Bash,Shell,我目前有一个Perl脚本(我无法编辑),它向用户询问一些问题,然后将生成的输出打印到stdout。我想创建另一个脚本来调用这个脚本,允许用户正常地与它交互,然后将stdout的输出存储到一个变量中 下面是一个非常简单的例子,说明我正在努力实现的目标: internal.pl #!/usr/bin/perl print "Enter a number:"; $reply = <>; print "$reply"; 期望输出: $ ./outer.sh Calling inner.pl
#!/usr/bin/perl
print "Enter a number:";
$reply = <>;
print "$reply";
期望输出:
$ ./outer.sh
Calling inner.pl
Enter a number: 7
7
Retrieved output: 7
但是,当我尝试此操作时,脚本将在“挂起”之前输出调用inner.pl的而不从inner.sh打印任何内容
通过使用脚本
命令将整个internal.sh交换存储到一个临时文件中,然后使用sed
等工具根据需要对其进行修改,我找到了一些解决方法。但是,为一些非常琐碎的事情创建临时文件并没有什么意义(更不用说script
喜欢为所有事情添加时间戳和\r
s)。有没有什么非代码脚本的方法来实现这一点?答案比这个简单。只需将inner的输出重定向到带有$()的变量:
编辑:
现在,如果用户与internal.sh
中的输出交互(例如internal.sh
要求用户输入一个数字,用它打印任何操作,并要求用户根据打印的结果输入一个新值)。那么最好是这样的临时文件:
#!/bin/bash
echo "Calling inner.sh"
TMPFILE=`mktemp`
./inner.sh | tee "$TMPFILE"
OUTPUT=$(cat "$TMPFILE")
rm "$TMPFILE"
echo "Retrieved output: $OUTPUT"
你的例子internal.sh
和outer.sh
对我来说非常有效……也许我当时过于简化了。原始的“inner.sh”实际上是一个Perl脚本。我对Perl一无所知,但这可能是我的输出无法工作的原因吗?也许Perl处理文件描述符和标准输出的方式不同以防万一,我会在我的问题中添加这个细节。
#!/bin/bash
echo "Calling inner.sh"
OUTPUT=$(./inner.sh)
echo "Retrieved output: $OUTPUT"
#!/bin/bash
echo "Calling inner.sh"
TMPFILE=`mktemp`
./inner.sh | tee "$TMPFILE"
OUTPUT=$(cat "$TMPFILE")
rm "$TMPFILE"
echo "Retrieved output: $OUTPUT"