사용자가 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는 파이썬과 다르게 응답 : 즉, 그것은 오류가있는 경우에도 명령을 실행하고 있습니다. 그러나 쉘 인터페이스가 여전히 부족합니다.
응용 프로그램은 대화 형 쉘 환경과 어떻게 상호 작용할 수 있습니까?
감사합니다. 나는 응용 프로그램이 그들의 STDIN이 키보드 (tty) 또는 파이프/파일에서 왔는지 여부를 알 수 있다는 것을 알지 못했습니다. 필자의 경우, 필자가 사용하고있는 쉘은 "대화식 모드"로 강제하는 옵션을 가지고있어서 tty 테스트를 건너 뛰게된다. [IRB의 예] (http://www.ruby-forum.com/topic/126906). 셸 XYZ를 사용하는 경우 "XYZ 강제 대화 형 모드"를 빠르게 검색하면이 옵션이 이미 있는지 알려줍니다. – sffc