На некоторых терминалах, таких как DEC VT102 и более поздних версиях VT, а также на многие эмуляторы терминала, особенно XTerm и его многочисленные имитации, отправляющие Esc < kbd>[ 6 n заставит терминал ответить Esc [ row< /em> ; column R, где row и column — десятичные представления положение текстового курсора.
Итак, ваш эмулятор терминала не отвечает ;1R
; он отвечает правильно, но процедуры чтения поглощают Esc [ и десятичные цифры до ; (и мигают на экране или издают звуковой сигнал , в зависимости от комплектации).
Вот хорошая команда Bash для иллюстрации:
out=''; \
echo $'\e[6n'; \
while read -n 1 -s -t 1; do out="$out$REPLY"; done < /dev/tty; \
echo -n "$out" | od -A x -t x1z -v
Запуск этого дает:
$ out=''; \
> echo $'\e[6n'; \
> while read -n 1 -s -t 1; do out="$out$REPLY"; done < /dev/tty; \
> echo -n "$out" | od -A x -t x1z -v
000000 1b 5b 31 36 3b 31 52 >.[16;1R<
000007
Обратите внимание, что ответ не обязательно приходит на стандартный ввод: ответ приходит с терминала, даже если стандартный ввод перенаправляется.
По просьбе спрашивающего, вот небольшая программа на C, которая частично дублирует функциональность скриптлета выше. Обратите внимание, что программа не обрабатывает перевод терминала в необработанный режим и обратно в приготовленный режим; это должно быть обработано вне программы, как указано ниже.
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main (void)
{
int ttyfd = open ("/dev/tty", O_RDWR);
if (ttyfd < 0)
{
printf ("Cannot open /devv/tty: errno = %d, %s\r\n",
errno, strerror (errno));
exit (EXIT_FAILURE);
}
write (ttyfd, "\x1B[6n\n", 5);
unsigned char answer[16];
size_t answerlen = 0;
while (answerlen < sizeof (answer) - 1 &&
read (ttyfd, answer + answerlen, 1) == 1)
if (answer [answerlen ++] == 'R') break;
answer [answerlen] = '\0';
printf ("Answerback = \"");
for (size_t i = 0; i < answerlen; ++ i)
if (answer [i] < ' ' || '~' < answer [i])
printf ("\\x%02X", (unsigned char) answer [i]);
else
printf ("%c", answer [i]);
printf ("\"\r\n");
return EXIT_SUCCESS;
}
Предполагая, что эта маленькая программа answerback.c
:
$ gcc -Wall -Wextra answerback.c -o answerback
$ stty raw -echo; ./answerback; stty sane
Answerback = "\x1B[24;1R"
$ _
person
AlexP
schedule
16.06.2018
GetCurPos()
а>. - person Marc.2377   schedule 16.06.2018