2016-11-22 3 views
2

에 저장합니다. 현재 사용자에게 몇 가지 질문을하고 표준 출력에 출력하는 Perl 스크립트 (편집 할 수 없음)가 있습니다. 나는이 스크립트를 호출하는 또 다른 스크립트를 만들고, 사용자가 정상적으로 그것과 상호 작용하도록 허용 한 다음 stdout의 결과를 변수에 저장합니다.대화 형 하위 스크립트를 호출하여 출력을 변수

는 여기에 내가 달성하기 위해 노력하고있어의 정말 간단한 예제 :

(here 연산 드 서켈로 답변에 따라) outer.sh

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

inner.pl

#!/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에 대해 아무 것도 모른다. 그러나 아마도 그것이 내 출력이 작동하지 않는 이유 일 수 있을까? 어쩌면 펄은 파일 기술자와 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" 
관련 문제