【问题标题】:Call an interactive subscript and save its output to variable调用交互式下标并将其输出保存到变量
【发布时间】:2017-04-06 18:50:11
【问题描述】:

我目前有一个 Perl 脚本(我无法编辑),它会询问用户几个问题,然后将生成的输出打印到标准输出。我想制作另一个调用该脚本的脚本,允许用户正常与其交互,然后将输出从 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 等根据我的需要进行修改。但是为这样的相当琐碎的事情制作临时文件并没有多大意义(更不用说script 喜欢为所有内容添加时间戳和\rs)。有没有非script 的方式来实现这一点?

【问题讨论】:

  • 你的例子 inner.sh 和 outer.sh 非常适合我......
  • 也许我当时过于简化了。原来的“inner.sh”实际上是一个 Perl 脚本。我对 Perl 一无所知,但这可能是我的输出不起作用的原因吗?也许 Perl 以不同的方式处理文件描述符和标准输出? - 以防万一,我会在我的问题中添加这个细节。

标签: linux bash shell


【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2021-11-12
    • 2011-11-10
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多