Это может звучать довольно странно, но я знаю, как установить положение вертикального курсора в Bash следующим образом:
echo -e "\e[12H"
Это перемещает курсор на 12-ю строку (начиная с 1).
Итак, как мне получить позицию курсора (номер строки), используя Linux Bash? Было бы полезно, если бы я мог просто сохранить это значение в переменной, чтобы я мог рассчитывать с ним.
РЕДАКТИРОВАТЬ:
Это ошибка, которую я получаю:
$ sh rowcol.sh
-en
read: 9: Illegal option -d
test.sh: 12: Bad substitution
Ответы:
Я смог использовать некоторые примеры из той же статьи о SO под названием: Как получить позицию курсора в bash? , Я публикую это здесь только для того, чтобы показать, что они работают и что содержание решений на самом деле также находится в U & L.
Решения Bash
Изнутри скрипта
ПРИМЕЧАНИЕ: я немного изменил вывод!
пример
Интерактивная оболочка
Эта цепочка команд работала для получения позиций строки и столбца курсора:
пример
ПРИМЕЧАНИЕ. Этот метод не подходит для любого типа сценария. Даже простые команды в интерактивном терминале у меня не работали. Например:
просто висит бесконечно.
решения тире / ш
Изнутри скрипта
Это решение предназначено для систем Ubuntu / Debian, которые поставляются со
dash
стандартным POSIX. Из-за этогоread
команда не поддерживает-d
переключение среди других различий.Чтобы обойти это, есть решение, которое использует
sleep 1
вместо-d
переключателя. Это не идеально, но предлагает хотя бы рабочее решение.пример
Интерактивная оболочка
Я не мог найти работоспособное решение, которое работало бы просто
sh
в интерактивной оболочке.источник
sh rowcol.sh
, Неважно, что вы помещаете в первую строку (#!/bin/bash
или#!/bin/sh
) или в конце файла!sh
это просто режим совместимостиbash
. Когда я делаю это (sh rowcol.bash
), это работает, разве это не работает для вас тогда?alias sh=bash
?Использование
-p
опции вместоecho
найденной решило проблему зависания в скрипте. Проверено сGNU bash, version 3.00.16(1)-release (x86_64-redhat-linux-gnu)
.работает в интерактивном режиме или в сценарии:
Выходы:
источник
Вы можете получить позицию курсора с помощью
ANSI CSI DSR
(Device Status Report):\e[6n
. Обратите внимание, что он возвращает его в формате, аналогичномANSI CSR CUP
(позиция курсора), который вы упоминаете в своем вопросе, однако он следует форме\e[n;mR
(где n - строка, а m - столбец).Подробнее о кодах выхода ANSI в Википедии .
Для получения значения в переменную ответили на StackOverflow .
Как упоминалось в предыдущем ответе / комментарии (и подробно описано в статье в Википедии), эти коды не всегда переносимы (от терминала к терминалу и от ОС к ОС). Я все еще думаю, что это лучше обрабатывается с помощью termcap / curses;)
источник
echo -e
,echo -en
аread ...
. Это происходит только тогда, когда код присутствует в файле! Я не очень понимаю это!echo -e
раньше работал, а сейчас нет! Что могло вызвать это и как я могу восстановить это?С
sh
синтаксисом POSIX :источник