Linux:与Lua的tput杯表演很奇怪

在Lua中,我试图使用shell命令“tput cup foo bar”来移动光标,'io.write('foo')'在这个位置写一个string。

os.execute('tput clear') --clear terminal os.execute('tput cup 2 9') --move cursor to line 2, col 9 io.write('A') --write 'A' at the cursor position os.execute('tput cup 8 2') --move cursor to line 8, col 2 io.write('B') --write 'B' at the cursor position 

但是,由于某种原因,它会在第二个光标位置(列2,第8行)上打印这两个字符。

当我使用print()而不是io.write()时,它会在正确的位置打印两个字符。 我不想使用print()出于显而易见的原因,那么如何使用io.write()将两个string写入正确的位置?

你确实需要调用io.flush() 。 @ lhf有正确的建议。 但诀窍是,你需要在代码中的正确位置

 os.execute('tput clear') --clear terminal os.execute('tput cup 2 9') --move cursor to line 2, col 9 io.write('A') --write 'A' at the cursor position io.flush() --*** this is what was missing os.execute('tput cup 8 2') --move cursor to line 8, col 2 io.write('B') --write 'B' at the cursor position 

输出到终端,有两个程序竞争写入终端:Lua和tput。 前两个对io.execute('tput')调用io.execute('tput')写入终端。 对io.write()的调用把字母“A”放在Lua的内部输出缓冲区中。 在下一次调用io.execute('tput')之前,我们必须强制这个缓冲输出去终端。

一般来说,在调用写入相同输出流的外部程序之前,应先刷新程序的输出缓冲区。 否则,输出缓冲会使事情无序到达输出流。