Обновление до местной команды PS до последних

Я ответил на этот вопрос в 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)   

0
05.11.2018, 13:09
1 ответ

С помощью 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 -.

3
28.01.2020, 02:31

Теги

Похожие вопросы