私は現在、ユーザーにいくつかの質問をして、生成された出力を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
方法はありますか?
あなたの例 'inner.sh'はと' outer.sh'が...私のために完全に働いた –
おそらく、私はそれを過剰に簡略化。元の "inner.sh"は実際にはPerlスクリプトです。私はPerlについて何も知らないが、おそらく私の出力がうまくいかない理由かもしれない?おそらくPerlはファイル記述子とstdoutを別々に扱うでしょうか? - その場合には、その詳細を私の質問に追加します。 – spellbee2