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')
,
В общем, вы должны очистить выходные буферы вашей программы перед вызовом любой внешней программы, которая записывает в тот же поток вывода. В противном случае буферизация вывода приведет к тому, что в выходной поток все выйдет из строя.