Итак, у меня возникла проблема с некоторыми программами cli. Иногда, когда я завершаю запущенный процесс с помощью Ctrl+C, он оставляет терминал в странном состоянии (например, эхо выключено). Теперь этого следует ожидать во многих случаях, так как уничтожение процесса не дает ему возможности восстановить состояние терминала. Но я обнаружил, что во многих других случаях виновником является завершение bash. В качестве примера попробуйте следующее:
- Запустите новый сеанс bash следующим образом:
bash --norc
чтобы убедиться, что никакие завершения не загружены. - Определите функцию завершения:
_completion_test() { grep -q foo /dev/null; return 1; }
. - Определите завершение, использующее указанную выше функцию:
complete -F _completion_test rlwrap
. - Введите точно следующее: r l w r a kbd> p Пробел c a t Tab Enter (т. е.
rlwrap cat
, затем Tab, а затем Enter). - Подождите секунду, а затем завершите процесс с помощью Ctrl+C.
- Эхо терминала не должно было быть отключено. Таким образом, если вы наберете какой-либо символ, он не будет воспроизведен терминалом.
Что действительно странно, так это то, что если я уберу, казалось бы, безобидный grep -q foo /dev/null
из функции завершения, все будет работать правильно. Фактически, добавление grep -q foo /dev/null
(или даже чего-то еще более простого, такого как cat /dev/null
) к любой функции завершения, установленной в моей системе, вызывает ту же проблему. Я также воспроизвел проблему с программами, которые не используют readline
и без Ctrl+C (например, find /var
Tab| head
, с приведенным выше завершением определено для find
).
Почему это происходит?
Правка. Просто поясню, приведенный выше пример является надуманным. На самом деле то, что я пытаюсь сделать, больше похоже на это:
_completion_test() {
if grep -q "$1" /some/file; then
#do something
else
#do something else
fi
}
Для более конкретного примера попробуйте следующее:
_completion_test() {
if grep -q foo /dev/null; then
COMPREPLY=(cats)
else
return 1
fi
}
Но сам факт того, что я звоню grep
, вызывает проблему. Я не понимаю, почему я не могу позвонить grep
в этом случае.
grep
/cat
. Я заставил это случиться с_c_t() { blah; }
. - person Etan Reisner   schedule 22.08.2016blah
? Буквальноblah
? Я обнаружил, что некоторые команды вызывают проблему, а некоторые нет. - person safsaf32   schedule 22.08.2016blah
(как в несуществующей команде). - person Etan Reisner   schedule 22.08.2016