ユーザーが IRB や Python などのコマンドライン インタラクティブ シェルと対話できるようにするアプリケーションを構築しようとしています。これは、ユーザー入力をシェルにパイプし、シェルの出力をユーザーに戻す必要があることを意味します。
これが STDIN、STDOUT、および STDERR をパイプするのと同じくらい簡単になることを望んでいましたが、ほとんどのシェルは、直接キーボード入力とは対照的に、STDIN 入力に対して異なる応答をするようです。
たとえば、STDIN を にパイプすると、次のようになりますpython
。
$ 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
Python は STDIN をスクリプト ファイルとして解釈しているようで、行頭の ">>>" のような対話型インターフェイスをパイプ処理していません。また、出力ファイルに「さようなら」が表示されないため、最初の行でエラーが発生して失敗します。
irb
(インタラクティブRuby)で何が起こるかは次のとおりです。
$ 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 は Python とは異なる応答をします。つまり、エラーが発生してもコマンドを実行し続けます。ただし、シェル インターフェイスはまだありません。
アプリケーションは、インタラクティブなシェル環境とどのように対話できますか?