2

ユーザーが 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 とは異なる応答をします。つまり、エラーが発生してもコマンドを実行し続けます。ただし、シェル インターフェイスはまだありません。

アプリケーションは、インタラクティブなシェル環境とどのように対話できますか?

4

1 に答える 1