0

bash のインタラクティブ モードを使用して、単純なターミナル GUI を実装しようとしています。bash の呼び出しに成功し、そのstdoutを取得して、すべてをテキスト ビューに出力しました。コマンドを実行できるように、ユーザー入力をテキスト ビューから bash のstdinに転送します。エラーメッセージが表示されないことを除けば、うまく機能します。

しかし、bash のstderrを自分のテキスト ビューに出力すると、奇妙なことに気付きました。エラーメッセージを受け取るようになったことに加えて、bash はstdinからstderrにすべてを渡すようです。このため、入力したすべての文字が 2 回出力されます (1 回は通常入力するため、もう 1 回はstderrからすべてを出力するため)。

また、stderr ( bash-3.2$) を介してプロンプトを出力するようです。これは予想される動作ですか?これを抑えることはできますか?

また、ユーザー入力をキャプチャして (ユーザーがテキスト ビューに直接入力できないように)、bash に依存してユーザー入力を出力しようとしました。stdoutstderrを介した出力の順序がランダムであることを除いて、これはほとんど機能しています。

のようなコマンドをecho test入力してEnterキーを押すと、時々次のようになります:
(2番目testは出力です。入力しませんでしたtesttest)

bash-3.2$ echo testtest
bash-3.2$ 

時々私は得る:

bash-3.2$ echo test
bash-3.2$ test

final \n、 output 、および nextを受け取る順序bash-3.2$は明らかに混同されています。

4

1 に答える 1

2

異なるパイプ間に順序の概念がないため、stdout と stderr を「正しい」順序で読み取る方法はありません。ただし、両方を別々のパイプに送るのではなく、両方を同じパイプ (つまり、同じファイル記述子) に送信するようにすることができます。これを行うには、bash サブプロセスを開始するために使用するオプションを調べます。または、のようなコマンドラインを開始することもできbash -c 'bash 2>&1'ます。

于 2012-12-07T00:49:15.827 に答える