2016-11-22 7 views
2

私は現在、ユーザーにいくつかの質問をして、生成された出力をstdoutに出力するPerlスクリプト(私は編集できません)を持っています。私はこのスクリプトを呼び出す別のスクリプトを作成し、ユーザーがそれを通常どおりにやり取りできるようにしてから、stdoutの出力を変数に保存します。ここで対話的な添え字を呼び出して、その出力を変数に保存します。

は私が達成しようとしているかの本当に簡単な例を示します(オプ・デ・CIRKEL hereによって回答に基づいて)

inner.pl

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

outer.sh

#!/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 

しかし、これを試すと、inner.shから何も印刷せずに "hanging"する前にCalling inner.plが出力されます。

scriptコマンドを使用してinner.sh交換全体を一時ファイルに保存し、次にsedなどを使用して自分のニーズに合わせて修正する方法を少し見つかりました。しかし、それほど些細なことのために一時ファイルを作ることは意味がありません(scriptはタイムスタンプを追加するのが好きでなく、すべてに\rを追加することは好きではありません)。これを達成するための非 - script方法はありますか?

+0

あなたの例 'inner.sh'はと' outer.sh'が...私のために完全に働いた –

+0

おそらく、私はそれを過剰に簡略化。元の "inner.sh"は実際にはPerlスクリプトです。私はPerlについて何も知らないが、おそらく私の出力がうまくいかない理由かもしれない?おそらくPerlはファイル記述子とstdoutを別々に扱うでしょうか? - その場合には、その詳細を私の質問に追加します。 – spellbee2

答えて

1

答えはそれより簡単です。

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

EDIT: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" 
関連する問題