2016-11-22 59 views
2

我目前有一個Perl腳本(我無法編輯)詢問用戶幾個問題,然後將生成的輸出打印到標準輸出。我想創建另一個腳本來調用這個腳本,允許用戶像平常一樣與它交互,然後將stdout的輸出存儲到一個變量中。調用交互式下標並將其輸出保存到變量

這裏是什麼,我試圖完成一個非常簡單的例子:

inner.pl

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

outer.sh(基於由運德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而不打印任何內容。

我發現了一點變通方法,使用script命令將整個inner.sh交換存儲到一個臨時文件,然後使用sed等來修改它以滿足我的需要。但是對於像這樣相當瑣碎的東西創建臨時文件並沒有多大意義(更不用說script喜歡在所有內容中添加時間戳和\r)。有沒有非script方法來完成這一點?

+0

你的榜樣'inner.sh'和'outer.sh'完美的工作對我來說... –

+0

也許我過於簡單化了它,然後。原來的「inner.sh」實際上是一個Perl腳本。我對Perl沒有任何瞭解,但是這可能是我的輸出不起作用的原因嗎?也許Perl不同地處理文件描述符和標準輸出? - 以防萬一,我會將這個細節添加到我的問題中。 – spellbee2

回答

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"