Получить позицию курсора терминала ma c в скрипте, в котором подавлены сообщения управления заданиями, вызывает зависание - PullRequest
0 голосов
/ 29 марта 2020

Странная и несколько сложная ситуация:

Я пытаюсь сохранить текущую строку курсора в переменной в функции, а затем восстановить ее после некоторого другого перемещения.

скрипт, который делает это, вызывается небольшой иерархией других функций, верхний уровень которой должен сначала запустить другую функцию в фоновом режиме (с &).

Я хочу подавить сообщения управления заданиями, но при этом (с 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) строки останавливает код задолго до того, как он доходит до этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...