Linux: Tput Cup с Lua ведет себя странно

В Lua я пытаюсь использовать команду оболочки 'tput cup foo bar' для перемещения курсора и 'io.write (' foo ')', чтобы написать строку в этой позиции.

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()?

1 ответ

Вам нужно позвонить 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.write() помещает букву "A" во внутренний буфер вывода Lua. Мы должны заставить этот буферизованный вывод перейти на терминал, прежде чем мы сделаем следующий вызов io.execute('tput'),

В общем, вы должны очистить выходные буферы вашей программы перед вызовом любой внешней программы, которая записывает в тот же поток вывода. В противном случае буферизация вывода приведет к тому, что в выходной поток все выйдет из строя.

Другие вопросы по тегам