Вы могли бы попробовать пару вещей. Избавьтесь от DoEvents внутри ChangedEvent.
Я знаю, что события действительно вызывают проблемы, но я редко использую его.
После некоторых копаний я в итоге посмотрел на исходный код и обнаружил, что bash не поддерживает пользовательских исполнителей. Ниже приведен патч для добавления нового дескриптора, который работает аналогично command_not_found_handler
.
diff --git a/eval.c b/eval.c
index f02d6e40..8d32fafa 100644
--- a/eval.c
+++ b/eval.c
@@ -52,6 +52,10 @@
extern sigset_t top_level_mask;
#endif
+#ifndef EXEC_HOOK
+# define EXEC_HOOK "command_exec_handle"
+#endif
+
static void send_pwd_to_eterm __P((void));
static sighandler alrm_catcher __P((int));
@@ -172,7 +176,15 @@ reader_loop ()
executing = 1;
stdin_redir = 0;
- execute_command (current_command);
+ SHELL_VAR *hookf = find_function (EXEC_HOOK);
+ if (hookf == 0) {
+ execute_command (current_command);
+ } else {
+ char *command_to_print = make_command_string (current_command);
+ WORD_LIST *og = make_word_list(make_word(command_to_print), (WORD_LIST *)NULL);
+ WORD_LIST *wl = make_word_list(make_word(EXEC_HOOK), og);
+ execute_shell_function (hookf, wl);
+ }
exec_done:
QUIT;
Затем можно определить function command_exec_handle() { eval $1; }
, который будет выполняться вместо исходной команды, указанной в приглашении. Исходная команда полностью в первом параметре. command_exec_handle
может быть указан в .bashrc, и он работает как ожидалось.
Обратите внимание: это очень опасно! Если вы запутаетесь и поместите плохой обработчик command_exec_handler в .bashrc
, у вас может получиться оболочка, которая не выполняет команды. Это будет довольно сложно исправить без загрузки с живого компакт-диска.
Кажется, у вас есть та же самая проблема, перечисленная здесь здесь . Если вы хотите выполнить некоторые команды, если ваша оригинальная команда не была найдена, Bash 4 command_not_found_handler
наверняка подойдет вам.
Попытайтесь быть более конкретным, возможно, с некоторыми фрагментами кода, которые работают или не работают, чтобы помочь нам помочь вам ...