2013-05-11 2 views
1

사용자가 IRB 또는 Python과 같은 명령 줄 대화 형 셸과 상호 작용할 수있는 응용 프로그램을 작성하려고합니다. 즉, 사용자 입력을 셸에 파이프하고 셸의 출력을 다시 사용자에게 전달해야합니다.입력 및 출력을 대화식 셸로 파이프하는 방법은 무엇입니까?

STDIN, STDOUT 및 STDERR과 같이 쉽게 처리 할 수 ​​있기를 기대했지만 대부분의 셸은 직접 키보드 입력과 달리 STDIN 입력과 다르게 반응하는 것으로 보입니다.

예를 들어, 여기 python에 내가 파이프 STDIN이 때 발생하는 것입니다 :

$ python 1> py.out 2> py.err <<EOI 
> print 'hello' 
> hello 
> print 'goodbye' 
> EOI 
$ cat py.out 
hello 
$ cat py.err 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
NameError: name 'hello' is not defined 

파이썬 스크립트 파일로 STDIN을 해석하는 것 같다, 그리고 파이프하지 않는 대화 형 인터페이스의, 줄의 시작 부분에있는 ">>>"와 같습니다. outfile에서 "goodbye"가 보이지 않기 때문에 오류가있는 첫 번째 행에서도 실패합니다.

여기 irb (대화 형 루비)와 함께 일어나는 것이다 :

$ irb 1> irb.out 2> irb.err <<EOI 
> puts 'hello' 
> hello 
> puts 'goodbye' 
> EOI 
$ cat irb.out 
Switch to inspect mode. 
puts 'hello' 
hello 
nil 
hello 
NameError: undefined local variable or method `hello' for main:Object 
    from (irb):2 
    from /path/to/irb:16:in `<main>' 
puts 'goodbye' 
goodbye 
nil 

$ cat irb.err 

IRB는 파이썬과 다르게 응답 : 즉, 그것은 오류가있는 경우에도 명령을 실행하고 있습니다. 그러나 쉘 인터페이스가 여전히 부족합니다.

응용 프로그램은 대화 형 쉘 환경과 어떻게 상호 작용할 수 있습니까?

답변

1

기술적으로 첫 번째 샘플은 입력을 파이썬으로 파이핑하지 않습니다. 그것은 파일에서 오는 것이고 - 네, 파일 입력은 다르게 취급됩니다.

입력이 터미널에서 오는 프로그램을 설득하는 방법은 의사 -ty를 사용하고 있습니다. 마스터 쪽과 슬레이브 쪽이 있습니다. 쉘 (Python, Ruby)을 슬레이브 측에 연결하고, 제어 프로그램이 마스터 측에 쓰고 읽도록하십시오.

설정하는 것이 상당히 까다 롭습니다. pseudo-tty를 관리하려면 expect 또는 해당 클론 중 하나를 사용하는 것이 더 좋습니다. 기타 관련 질문 중 How to perform automated Unix input?

+0

감사합니다. 나는 응용 프로그램이 그들의 STDIN이 키보드 (tty) 또는 파이프/파일에서 왔는지 여부를 알 수 있다는 것을 알지 못했습니다. 필자의 경우, 필자가 사용하고있는 쉘은 "대화식 모드"로 강제하는 옵션을 가지고있어서 tty 테스트를 건너 뛰게된다. [IRB의 예] (http://www.ruby-forum.com/topic/126906). 셸 XYZ를 사용하는 경우 "XYZ 강제 대화 형 모드"를 빠르게 검색하면이 옵션이 이미 있는지 알려줍니다. – sffc