4

カスタムスクリプト言語用のLinuxシェルを作成していますが、ユーザーが1つのステートメントを入力する各フォローアップ行の前に「...」を出力します。最初の行には「>>>」が出力されます。 、入力を待ちます。次に例を示します。

>>> void f() {
...  "this is a test"
... }
>>> 

で行をfgets読んでいて、完全に読んだ後、「...」を出力し、。への別の呼び出しを使用して繰り返しますfgets。これは、適度に高速なインタラクティブ入力で問題なく機能します。しかし、改行を含むコードをターミナルに貼り付けると、次のようになります。

>>> void f() {
 "this is a test"
}
... ... >>> 

fflush「...」は、に印刷した後に呼び出しを送信しても、印刷が遅すぎますstdout。この仕事をするために何か特別なことをする必要があるかどうか誰かが知っていますか?

4

2 に答える 2

1

端末のエコー (「参考文献」を参照) をオフstty(1) -echoにすると、入力が画面に表示されるタイミングを完全に制御できます。

私の推測では、貼り付けによってすべての行が一度に端末に書き込まれ、必要に応じてプログラムが出力を端末に送信する機会が得られないということです。そのため、エコーをオフにしてユーザーの入力を出力すると、改行文字が表示されたときに特別な処理を実行できます。

irbプログラムを実行すると、プログラムが非常によく似た動作をすることがわかりますstrace

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
...
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = 0
于 2011-03-17T23:27:44.907 に答える
0

stdio を使用してこれを行う簡単な方法はありません。端末を制御するには、ncursesなどを使用する必要があります。問題は、そのような複数の行をコピーして貼り付けると、すべてが への 1 回の呼び出しで stdin の読み取りバッファーに取り込まれるread(2)ため、stdout が介入して介在するプロンプトを出力する機会がないことです。

于 2011-03-17T23:25:41.987 に答える