захватить все команды bash в качестве параметров для собственного бегуна

Вы могли бы попробовать пару вещей. Избавьтесь от DoEvents внутри ChangedEvent.

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

0
задан Al Hoo 19 March 2019 в 11:23
поделиться

2 ответа

После некоторых копаний я в итоге посмотрел на исходный код и обнаружил, что 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, у вас может получиться оболочка, которая не выполняет команды. Это будет довольно сложно исправить без загрузки с живого компакт-диска.

0
ответ дан Al Hoo 19 March 2019 в 11:23
поделиться

Кажется, у вас есть та же самая проблема, перечисленная здесь здесь . Если вы хотите выполнить некоторые команды, если ваша оригинальная команда не была найдена, Bash 4 command_not_found_handler наверняка подойдет вам.

Попытайтесь быть более конкретным, возможно, с некоторыми фрагментами кода, которые работают или не работают, чтобы помочь нам помочь вам ...

0
ответ дан vfalcao 19 March 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: