Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 调用交互式下标并将其输出保存到变量_Linux_Bash_Shell - Fatal编程技术网

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

Linux 调用交互式下标并将其输出保存到变量,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

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

下面是一个非常简单的例子,说明我正在努力实现的目标:

internal.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"