捕获所有bash命令作为自定义运行程序的参数

时间:2019-03-19 10:51:00

标签: bash

我有一个自定义的“运行程序”脚本,我需要使用它来运行所有终端命令。在下面,您可以在脚本中看到基本概念。

#!/usr/bin/env bash
echo "Running '$@'"
# do stuff before running cmd
$@
echo "Done"
# do stuff after running cmd

我可以在bash中使用脚本,如下所示:

$ ./run.sh echo test
Running 'echo test'
test
Done
$

我想这样使用它:

$ echo test
Running 'echo test'
test
Done
$

Bash具有trap ... DEBUGPROMPT_COMMAND,这使我可以在命令之前 之后执行命令,但是有什么可以允许的我要执行命令的代替

如果我有一个空的command_not_found_handle env变量,也可以使用PATH,但这似乎太脏了。

2 个答案:

答案 0 :(得分:0)

经过一番挖掘,我最终查看了源代码,发现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中给出,它可以按预期工作。

注意:这非常危险!如果您搞砸了,并且在.bashrc中放了一个错误的command_exec_handler,则可能会遇到无法执行命令的外壳。如果不从实时CD引导,将很难修复。

答案 1 :(得分:-2)

似乎您在here中列出了相同的问题。如果您想在未找到原始命令的情况下运行某些命令,那么Bash 4的command_not_found_handler肯定会满足您的需求。

尝试更具体一些,也许提供一些行之有效的代码片段,以帮助我们为您提供帮助...