我有一个自定义的“运行程序”脚本,我需要使用它来运行所有终端命令。在下面,您可以在脚本中看到基本概念。
#!/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 ... DEBUG
和PROMPT_COMMAND
,这使我可以在命令之前和 之后执行命令,但是有什么可以允许的我要执行命令的代替?
如果我有一个空的command_not_found_handle
env变量,也可以使用PATH
,但这似乎太脏了。
答案 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
肯定会满足您的需求。
尝试更具体一些,也许提供一些行之有效的代码片段,以帮助我们为您提供帮助...