Я ответил на этот вопрос в StackOverflow несколько месяцев назад, см. Перезапись последнего вывода терминала (несколько строк) . Хотя я полагаю, возможно , что OP намеревался напечатать буквально «строка1», «строка2» и т. Д., Это было бы интересно только при выполнении упражнения в классе. Реальные программы печатают более интересные вещи, поэтому я отвечаю на этот вопрос. Как и раньше, текущий q / a не учитывает проблему, когда обновленные строки короче существующей строки. Обращаясь к
#!/bin/bash
tput sc
while :
do
tput rc
echo "line1"; tput el
echo "line2"; tput el
echo "line3"; tput el
echo "line4"; tput el
# without using clear cmd, next cycle line1 should be printed
# in line1 place not in a new line , and same for other lines
done
Согласившись, что cuu
является хорошей альтернативой, использование grep
для проверки доступности возможности кажется менее эффективным, чем использование самого tput
, например,
restore=$(tput sc)
[[ -z "$restore" ]] && restore=$(tput cuu 4)
[[ -z "$restore" ]] && restore=$(tput cuu1; tput cuu1; tput cuu1; tput cuu1)
что все еще немного грубо в том, как количество строк встраивается в выражения. Но тогда вы можете просто выполнить $ restore
в конце цикла.
Нечто подобное можно сделать с проверкой el
в терминале.
Учитывая, что это bash, echo "line1"
и т. Д. Действительно должно быть функцией (которая устранит избыточные вызовы tput el
).
Все эти возможности, вероятно, будут поддерживаться терминалами, с которыми, вероятно, столкнется OP. Элементы управления курсором сохранения / восстановления являются слабым местом, поскольку существует два основных варианта:
DECSC
/ DECRC
(поддерживается xterm - см. XTerm Control Sequences ):
ESC 7 Save Cursor (DECSC).
ESC 8 Restore Cursor (DECRC).
ANSI.SYS (также поддерживается xterm, но не всеми "эмуляторами xterm") :
CSI s Сохранить курсор (ANSI.SYS), доступный только при отключенном DECLRMM.
CSI u Восстановить курсор (ANSI.SYS).
Другие полезные источники информации:
Вопрос, кстати, неправильно назван, поскольку в приведенном примере (и пока ни в одном из ответов) используется прокрутка . Можно (снова обращаясь к terminfo и ограничиваясь терминалами типа VT100, такими как xterm) использовать области прокрутки. Место для начала будет здесь (со страницы руководства terminfo):
change_scroll_region csr cs change region to
line #1 to line #2
(P)
С помощью Homebrew на macOS вы можете pstree
установить аналогичную функциональность.
В комментариях вы говорите, что пробовали это, но это дает слишком много информации. Вам следует прочитать руководство pstree
, чтобы понять, как использовать этот инструмент. Обратите внимание, что pstree
также доступен в Linux.
Чтобы получить дерево процессов для текущего процесса оболочки:
desktop:~ myself$ pstree -p $$
-+= 00001 root /sbin/launchd
\-+= 00985 myself /Applications/iTerm.app/Contents/MacOS/iTerm2
\-+= 00989 myself /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp myself
\-+= 00990 root login -fp myself
\-+= 00991 myself -bash
\-+= 51939 myself pstree -p 991
\--- 51940 root ps -axwwo user,pid,ppid,pgid,command
Утилита Linux ps
не может быть установлена на macOS, насколько мне известно, вероятно, из-за того, что она интенсивно использует файловую систему /proc
, специфичную для Linux -.