2014-02-28 2 views
2

리눅스 명령을 실행 I 가지고는 출력 인쇄 TCL

mFpVuBreI0dPENLF 

를 I 리눅스를 전화 exec를 사용한 TCL 스크립트 다음

for {set kb 0} {$kb<5} {incr kb} { 
    exec openssl rand -base64 12 
    puts "end" 
} 

위의 스크립트를 실행하면 단어 "end"가 네 번 인쇄되지만 openssl rand -base64 12의 출력은 인쇄되지 않습니다. 이것에 대한 이유는 무엇입니까?

아무도 도와 줄 수 있습니까?

답변

3

실행 된 하위 프로세스의 출력을 캡처하여 인쇄하십시오. 예 :

for {set n 0} {$n < 4} {incr n} { 
    set r [exec openssl rand -base64 12] 
    puts [format {%d %s} $n $r] 
} 

시험이 : 표준 출력 후 간부 재 지정되지 않은 경우

: 이유는 서브 프로세스의 표준 출력 as documented 캡처 한 것을

$ tclsh8.5 z.tcl 
0 GG6ppnaPgJoTPxlC 
1 xLHDiDBBQ6cxxvmg 
2 wGnqqegconlwu3YV 
3 QRM0IsXzw4rk3r+j 

명령은 파이프 라인의 마지막 명령에서 표준 출력을 반환합니다.

그래서 openssl의 stdout은 더 이상 터미널에 연결되지 않습니다. 대신 Tcl은 매뉴얼 페이지에 주어진 리디렉션 옵션 중 하나를 사용하지 않는 한 변수를 읽은 다음 변수에 쓰는 모든 것을 저장합니다. open을 사용하여 많은 양의 출력을 생성하는 프로세스의 경우 출력을 읽을 수 있지만이 예제에서는 exec을 사용하는 것이 좋습니다.