Странная и несколько сложная ситуация:
Я пытаюсь сохранить текущую строку курсора в переменной в функции, а затем восстановить ее после некоторого другого перемещения.
скрипт, который делает это, вызывается небольшой иерархией других функций, верхний уровень которой должен сначала запустить другую функцию в фоновом режиме (с &
).
Я хочу подавить сообщения управления заданиями, но при этом (с 2>/dev/null
), кажется, также зависает получение позиции курсора.
Bash, в Терминале, в macOS 10.15.4.
Я рассмотрел несколько ответов по всей сети для получения позиции курсора, большая часть которой сводится к манипулированию \e[6n
. В частности, я рассмотрел этот вопрос и его ответы , некоторые из которых относятся к аналогичным вопросам и их ответам.
Итак, мои функции для определения положения курсора:
cursorGetRowCol() {
local choice=$1 # "r" for row or "c" for column or nothing/anything else for both.
local ROW
local COL
IFS=';' read -sdR -p $'\e[6n' ROW COL
ROW="${ROW#*[}"
if [[ ${choice} = "r" ]]; then
echo "${ROW}"
elif [[ ${choice} = "c" ]]; then
echo "${COL}"
else
echo "(${ROW},${COL})"
fi
}
cursorGetRow(){
cursorGetRowCol "r"
}
cursorGetCol(){
cursorGetRowCol "c"
}
У меня есть еще одна функция, которая вызывает cursorGetRow:
holdMessage() {
# some stuff
local originalRow=$(cursorGetRow)
# some more stuff
}
У меня есть еще одна функция, которая вызывает эту функцию в пределах al oop:
holdWhileCF() {
# some stuff
while [ <some condition> ]; do
# some more stuff
holdMessage <...>
# some more stuff
done
# some more stuff
}
Наконец, функция, которая вызывает это:
ff0() {
ffs0 &
holdWhileCF <...>
wait $!
} 2>/dev/null
Я не верю, что имеет значение, что делают ff0
, ffs0
, et c., и все "некоторые (более) вещи" биты. Кажется, проблема в том, что подавление заданий портит read
или что-то еще в этой строке. Я обнаружил следующее:
- , когда я исключаю или комментирую
2>dev/null
, все работает, за исключением того, что я получаю сообщения управления заданиями, которые мне не нужны (для ffs0
). - Когда я исключаю или комментирую строку
IFS=';' read ..."
и назначаю произвольные значения для ROW и COL, все работает, за исключением того, что, очевидно, я не получаю нужную позицию курсора. - , когда я не ни один из этих (ie. включает оба этих фрагмента кода) он зависает на неопределенный срок.
- Я пробовал некоторые другие примеры и ответы с этого сайта и других в Интернете, чтобы получить положение курсора, но все, кажется, имеют тот же результат (и все, кажется, требуют некоторого использования
\e[6n
и read
).
Эта теория может быть правильной или неправильной, но в любом случае моего понимания read
, а также заданий и их отодвигания на задний план недостаточно, чтобы я не мог этого понять.
Короче говоря: есть ли способ подавить эти сообщения управления заданиями и до сих пор получить курсор по sition без зависаний?
Я бы действительно предпочел решения, которые не включают установку других инструментов, которые не поставляются с MacOS. В то же время мне не нужно портативное решение. Он просто должен работать в моем macOS bash, больше нигде не нужен.
Спасибо!
PS. Интересно, что когда я помещаю несколько строк echo "debug n"
, где n
- это разные числа, и ни один из кодов не исключен или не прокомментирован, я обнаружил, что он никогда не превращается в функцию cursorGetRow
(но выполняет все до вызова который). Я не понимаю этого. Если ЕДИНСТВЕННАЯ вещь, которую я комментирую, это строка с read
внутри (внутри функции cursorGetRowCol
), то она проходит до конца. Почему существование этой (казалось бы, проблематичной c) строки останавливает код задолго до того, как он доходит до этого?