Что ж, согласно некоторым из ваших правок, у вас есть CTRL + J
, привязанный к макрос-команде bindkey
. Это объясняет вашу проблему bash
, учитывая поведение по умолчанию для readline
.
Обычно readline
считывает ввод в чем-то очень похожем на режим stty raw
. Входные символы считываются, как только они набираются, и строковый редактор оболочки обрабатывает собственную буферизацию. readline
устанавливает терминал в необработанный режим, когда он переходит на передний план, и восстанавливает его до того состояния, в котором он находился до этого, при вызове другой группы процессов переднего плана.
CTRL + J
- перевод строки ASCII. ABCDEFGHIJ
находится в 10 байтах от NUL. Поскольку вы настроили readline
, чтобы съесть этот символ и впоследствии удалить то, что осталось от любой командной строки, в которой он выполняется с завершением меню, опережающий ввод не будет работать. Терминал находится в другом состоянии, когда опережающий ввод буферизуется дисциплиной ядра, чем когда readline
находится на переднем плане.
Когда readline
находится на переднем плане, он выполняет свое собственное преобразование для возврата каретки ввода -> новой строки, и драйвер терминала не преобразует его вообще. Однако, когда вы вводите свой ввод с опережающим вводом, драйвер терминала обычно переводит символы возврата на новую строку, как это можно настроить с помощью stty [-] icrnl
.И поэтому вашего ключа возврата достаточно для команд, введенных в реальном времени, но новые строки, отправленные терминалом line-discline, интерпретируются как команды завершения меню.
Вы можете указать драйверу терминала остановить преобразование с помощью stty -icrnl
. Скорее всего, придется немного привыкнуть к этому. Другие команды, принимающие ввод с терминала, обычно ожидают перевода строки, а не возврата, поэтому вам придется либо явно использовать CTRL + J
, когда они управляют передним планом, либо научить их обрабатывать возврат как ] bash
делает.
Вы уже упоминали, что чтение
не работает должным образом при чтении с терминала. Опять же, скорее всего, если бы вы явно использовали CTRL + J
для завершения строки ввода. Или ... вы можете научить его:
read()
if [ -t 0 ]
then command read -d $'\r' "$@"
else command read "$@"
fi
Вероятно, в долгосрочной перспективе будет намного меньше хлопот, если вы найдете другой ключ для завершения меню. Новые строки имеют большое значение для большинства терминальных приложений.
Виновником был оператор bitmap=/media/intent.bin
в /etc/mdadm/mdadm.conf
После того, как я просто оставил там ARRAY /dev/md0 UUID=xxx
, массив стал активным после перезагрузки. (Однако теперь у меня возникла проблема, заключающаяся в том, что внешнее растровое изображение не используется должным образом.)