Взгляните на man uname
.
Можно скомпилировать и запустить 32-разрядные программы на 64-разрядной машине (хотя это требует специальной установки), но не может выполнить 64-разрядные двоичные файлы в 32-разрядной системе. То же относится ко многим Виртуальным машинам, но не all*. Таким образом, если у Вас есть ядро на 64 бита, нет никакого способа, которым Ваши аппаратные средства составляют 32 бита только.
Если Вы хотите протестировать, для какой разрядности программа в двоичном представлении сделана, выполнение file /path/to/the/program
.
* Это зависит на уровне, на который воздействует данная Виртуальная машина: Те, которые выполняют двоичный код (почти) непосредственно на хосте ЦП, не смогут выполнить 64-битный код на 32-разрядном хосте. Те, которые эмулируют определенный ЦП, могут сделать это, но они менее эффективны из-за уровня эмуляции.
В первую очередь, Ваш вопрос не имеет никакого отношения к удару, но с терминалом. Терминал отвечает для отображения текста программ, и сам удар не имеет никакого контроля над программами, после того как они запустились.
Терминалы предлагают управляющие последовательности для управления цветом, шрифтом, позицией курсора и т.д. Поскольку список стандартизированных терминальных последовательностей взглянул на 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-последовательности.
Вместо использования echo
который автоматически добавляет новую строку к строке, использовать printf "%s\r" whatever
- возврат каретки отправляет курсор в начало текущей строки. пример:
seq 1 15 | while read num; do printf "%2d\r" $num; sleep 1; done; echo ""
Тем, кто нашел эту тему, я также рекомендую ознакомиться с 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;
}