Any ideas how to fix or bypass this ?
Вы можете обойти это, включив режим posix либо с помощью опции
--posix
, либо временно с помощьюset -o posix
:.
set -o posix select opt in foo bar baz; do echo "opt=$opt" done set +o posix
Для объяснения такого поведения вы можете посмотреть на функцию
zread()
, которая используется встроенной функциейread
(, которая также вызывается внутри bash вselect
):.
while ((r = read (fd, buf, len)) < 0 && errno == EINTR) /* XXX - bash-5.0 */ /* We check executing_builtin and run traps here for backwards compatibility */ if (executing_builtin) check_signals_and_traps (); /* XXX - should it be check_signals()? */ else check_signals ();
По какой-то особой причине
executing_builtin
устанавливается только при явном вызове встроенной функцииread
, а не при ее вызове с помощьюselect
. Это очень похоже на ошибку, а не на что-то преднамеренное.При работе в режиме posix сигнал отменяет встроенную функцию
read
. В этом случае вызываетсяzreadintr()
, что, в отличие отzread()
, не является повторным -вызовом прерванного системного вызоваread(2)
после запуска ловушек. См.builtins/read.def
:if (unbuffered_read == 2) retval = posixly_correct ? zreadintr (fd, &c, 1) : zreadn (fd, &c, nchars - nr); else if (unbuffered_read) retval = posixly_correct ? zreadintr (fd, &c, 1) : zread (fd, &c, 1); else retval = posixly_correct ? zreadcintr (fd, &c) : zreadc (fd, &c);
Подробнее о «перезапуске» bash
read
встроенной здесь .
Итак, я наконец-то смог получить доступ к настройкам дисплея для внешнего монитора, и по какой-то странной причине масштабирование дисплея было установлено на 48x, что вызывало массу проблем. Я только что изменил это обратно 1 раз, и теперь все работает нормально.