Создание скрипта с циклическим циклом на одном экране

Направления обрабатываются слева направо.

ls > dirlist 2>&1

Заставьте оболочку, которая в конечном итоге превратится в ls, выполнить следующие системные вызовы (проверка ошибок опущена для краткости).

/* Handle > dirlist */
int temp_fd = open("dirlist",O_WR);  /* Open dirlist for output */
dup2(temp_fd, 1); /* Make file descriptor 1 (stdout) point to dirlist */
close(temp_fd);  /* Don't need this other file descriptor for dirlist */
/* Handle 2>&1 */
dup2(1,2); /* Make fd 2 be a copy of fd 1, which points to dirlist */

То есть сначала изменяется fd 1, а затем fd 2.

И наоборот, ls 2>&1 > dirlist делает

/* Handle 2>&1 */
dup2(1,2); /* Make fd 2 be a copy of fd 1, the original stdout */
/* Handle > dirlist */
int temp_fd = open("dirlist",O_WR);  /* Open dirlist for output */
dup2(temp_fd, 1); /* Make file descriptor 1 (stdout) point to dirlist */
close(temp_fd);  /* Don't need this other file descriptor for dirlist */

Другой способ посмотреть на это - это просто присваивания. Первоначально fd1=initial_stdout, затем

/* ls > dirlist 2>&1 */
fd1=to_dirlist
fd2=fd1 (i.e. to_dirlist)

/* ls 2>&1 > dirlist */
fd2=fd1 (i.e. initial_stdout)
fd1=to_dirlist.

Или вы можете сказать копирование по значению, а не копирование по ссылке.

2
10.11.2016, 04:19
1 ответ

Если предположить, что clear действительно очищает экран, то показанный сценарий сам по себе не создаст первый снимок экрана. Если у вас был дополнительный процесс, добавляемый в /tmp/temp_script.log , то это могло что-то сделать ...

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

  • обычно вы устанавливаете TERM на подходящее значение, которое соответствует описание терминала.
  • В «подходящем» описании терминала рассказывается, как очистить экран.
  • в качестве побочного эффекта очистка экрана (по соглашению) также перемещает курсор в верхний левый угол экрана, но
  • очистка экрана из верхнего левого угла экрана также приведет к удалению цветных строка (которую вы могли бы оставить)
  • , если бы вы хотели удалить из второй строки, вы могли бы (на большинстве терминалов) сделать
    printf '\033[2H\033[J'

или

    tput cup 1 0
    tput ed
  • , но имейте в виду, что если ваш Изначально приглашение не было в верхней части экрана, это просто оставит нетронутым то, что было в верхней части экрана.

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

    printf '\033[4H'

или

    tput cup 3 0

Собирая их вместе, ваш сценарий может выглядеть следующим образом (и с использованием printf , поскольку что-то кажется неправильным с вашим TERM и / или описанием терминала):

    #!/bin/bash

    if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
    #result=`sensors -A`
    count=0
    printf '\033[2H\033[J'
    keypress=''
    echo "linha 1"
    echo "Linha 2
    while [ "x$keypress" = "x" ]; do    
      let "count++" 
      printf '\033[4H'
      echo $count
      sleep 1 
      keypress="`cat -v`"
    done
    if [ -t 0 ]; then stty sane; fi
    exit 0

Дополнительная литература:

1
27.01.2020, 22:19

Теги

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