Как изменить содержание строки на терминале в противоположность записи новой?

Взгляните на man uname.

Можно скомпилировать и запустить 32-разрядные программы на 64-разрядной машине (хотя это требует специальной установки), но не может выполнить 64-разрядные двоичные файлы в 32-разрядной системе. То же относится ко многим Виртуальным машинам, но не all*. Таким образом, если у Вас есть ядро на 64 бита, нет никакого способа, которым Ваши аппаратные средства составляют 32 бита только.

Если Вы хотите протестировать, для какой разрядности программа в двоичном представлении сделана, выполнение file /path/to/the/program.

* Это зависит на уровне, на который воздействует данная Виртуальная машина: Те, которые выполняют двоичный код (почти) непосредственно на хосте ЦП, не смогут выполнить 64-битный код на 32-разрядном хосте. Те, которые эмулируют определенный ЦП, могут сделать это, но они менее эффективны из-за уровня эмуляции.

24
15.07.2012, 02:23
3 ответа

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

Терминалы предлагают управляющие последовательности для управления цветом, шрифтом, позицией курсора и т.д. Поскольку список стандартизированных терминальных последовательностей взглянул на http://www.termsys.demon.co.uk/vtansi.htm, Вы можете, например,

  • расположите курсор в начале строки
  • удалите строку впоследствии
  • запишите новую строку

создать индикатор выполнения.

Более усовершенствованные терминальные escape-последовательности являются обычно терминальным зависимым, например, работа только с Eterm или xterm. ncurses - является библиотекой программирования, чтобы создать интерактивные программы с терминалом, таким образом, Вы не должны будете использовать escape-последовательности.

Как перезаписать существующую строку с терминальными последовательностями

echo long text
sleep 1
printf "\033[1A"  # move cursor one line up
printf "\033[K"   # delete till end of line
echo foo

Как перезаписать существующую строку без терминальной последовательности

Одно простое решение не состоит в том, чтобы записать новую строку в конце, но записать возврат каретки, который в основном сбрасывает курсор к началу строки, например:

echo -n first 
sleep 1 
echo -ne "\rsecond"
echo

\r или возврат каретки поместит курсор в начале строки и позволяет Вам перезаписывать содержание строки.

Переключатель между буферами как less или vi

Поведение less происходит также из-за более усовершенствованной терминальной функции, альтернативного экрана:

В режиме VT102 существуют escape-последовательности, чтобы активировать и деактивировать альтернативный экранный буфер, который является тем же размером как область дисплея окна. При активации текущий экран сохраняется и заменяется альтернативным экраном. Сохранение строк, прокрученных от вершины окна, отключено, пока нормальный экран не восстанавливается. Термин ‐ ограничение (5) запись для xterm позволяет визуальному редактору vi (1) переключаться на альтернативный экран для редактирования и восстанавливать экран на выходе. Запись всплывающего меню делает простым переключиться между нормальными и альтернативными экранами для вырезанного и вставленного.

http://rosettacode.org/wiki/Terminal_control/Preserve_screen перечисляет некоторый пример, как сделать это самостоятельно, или через tput или через некоторые escape-последовательности.

32
27.01.2020, 19:40

Вместо использования echo который автоматически добавляет новую строку к строке, использовать printf "%s\r" whatever - возврат каретки отправляет курсор в начало текущей строки. пример:

seq 1 15 | while read num; do printf "%2d\r" $num; sleep 1; done; echo ""
15
27.01.2020, 19:40

Тем, кто нашел эту тему, я также рекомендую ознакомиться с Bash Prompt HOWTO -Движение курсора .

Примеры:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

Некоторые примеры на C:

void saveCursorPosition() {
  printf("\033[s");
}

void restoreCursorPosition() {
  printf("\033[u");
}

void lineUP(short int times) {
  printf("\033[%iA", times);
}

void lineDown(short int times) {
  printf("\033[%iB", times);
}

Пример программы:

#include <stdio.h>
#include <unistd.h>

void saveCursorPosition() {
  printf("\033[s");
}

void restoreCursorPosition() {
  printf("\033[u");
}

void lineUP(short int times) {
  printf("\033[%iA", times);
}

void moveCursorBackwards(short int times) {
  printf("\033[%iD", times);
}

void printMainText() {

  printf("\n ╔═══════════════════════════════╗");
  printf("\n ║                               ║");
  printf("\n ║ Progress Bar                  ║");
  printf("\n ║                               ║");
  printf("\n ║ []                            ║");
  printf("\n ║                               ║");
  printf("\n ║ Press Ctrl+C to close         ║");
  printf("\n ║                               ║");
  printf("\n ╚═══════════════════════════════╝\n");

}

int main(int argc, char **argv) {

  printMainText();

  for (int progress=0; progress <= 10; progress++) {

    saveCursorPosition();
    lineUP(5);

    printf("\r ║     [");
    fflush(stdout);

    for (int i=0; i<progress; i++) {
      printf("=>]");
      fflush(stdout);
      moveCursorBackwards(2);
    }

    moveCursorBackwards(progress + 5);

    printf("%i%%", progress * 10);
    fflush(stdout);

    restoreCursorPosition();

    sleep(1);

  }

  return 0;

}
0
09.10.2021, 08:59

Теги

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