Hello,
I want to propose patch that provides PREEXEC_COMMAND var similar to
PROMPT_COMMAND.I believe that this patch is not first that you recieve
but I will try.
The patch is in attachment (I don’t trust gmail editor).
Regards,
Constantine
diff --git a/doc/bash.1 b/doc/bash.1
index 5af7d42..33ba307 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -2112,6 +2112,12 @@ minimum, and there is a maximum value (currently 8192) that this may
not exceed.
The minimum value is system-dependent.
.TP
+.B CMD
+Is set before a command is run, each array field corresponds to one argument
+of the command line. It is intended to be used in PREEXEC_COMMAND scripts.
+In case of pipe-commands the command line of the last command in the
+pipe-chain is stored in CMD.
+.TP
.B COLUMNS
Used by the \fBselect\fP compound command to determine the terminal width
when printing selection lists.
@@ -2476,6 +2482,13 @@ had been executed.
When the shell enters \fIposix mode\fP, it sets this variable if it was
not already set.
.TP
+.B PREEXEC_COMMAND
+If this variable is set, and is an array,
+the value of each set element is executed as a command
+prior to issuing each entered commands in interactive mode.
+If this is set but not an array variable,
+its value is used as a command to execute instead.
+.TP
.B PROMPT_COMMAND
If this variable is set, and is an array,
the value of each set element is executed as a command
diff --git a/doc/bashref.texi b/doc/bashref.texi
index 9e23f58..3103f57 100644
--- a/doc/bashref.texi
+++ b/doc/bashref.texi
@@ -5595,6 +5595,12 @@ In some cases, Bash assigns a default value to the variable.
A colon-separated list of directories used as a search path for
the @code{cd} builtin command.
+@item CMD
+Is set before a command is run, each array field corresponds to one argument
+of the command line. It is intended to be used in @env{PREEXEC_COMMAND} scripts.
+In case of pipe-commands the command line of the last command in the
+pipe-chain is stored in @env{CMD}.
+
@item HOME
The current user's home directory; the default for the @code{cd} builtin
command.
@@ -6289,6 +6295,13 @@ not already set.
The process @sc{id} of the shell's parent process. This variable
is readonly.
+@item PREEXEC_COMMAND
+If this variable is set, and is an array,
+the value of each set element is executed as a command
+prior to issuing each entered commands in interactive mode.
+If this is set but not an array variable,
+its value is used as a command to execute instead.
+
@item PROMPT_COMMAND
If this variable is set, and is an array,
the value of each set element is interpreted as a command to execute
diff --git a/eval.c b/eval.c
index 1d967da..97002bd 100644
--- a/eval.c
+++ b/eval.c
@@ -50,6 +50,8 @@
static void send_pwd_to_eterm PARAMS((void));
static sighandler alrm_catcher PARAMS((int));
+static void process_variable_command PARAMS((char *));
+static void export_command PARAMS((COMMAND *));
/* Read and execute commands until EOF is reached. This assumes that
the input source has already been initialized. */
@@ -165,6 +167,8 @@ reader_loop ()
current_command_number++;
executing = 1;
+ export_command (current_command);
+ process_variable_command ("PREEXEC_COMMAND");
stdin_redir = 0;
execute_command (current_command);
@@ -287,31 +291,31 @@ execute_array_command (a, v)
#endif
static void
-execute_prompt_command ()
+process_variable_command (char *varname)
{
char *command_to_execute;
- SHELL_VAR *pcv;
+ SHELL_VAR *cv;
#if defined (ARRAY_VARS)
ARRAY *pcmds;
#endif
- pcv = find_variable ("PROMPT_COMMAND");
- if (pcv == 0 || var_isset (pcv) == 0 || invisible_p (pcv))
+ cv = find_variable (varname);
+ if (cv == 0 || var_isset (cv) == 0 || invisible_p (cv))
return;
#if defined (ARRAY_VARS)
- if (array_p (pcv))
+ if (array_p (cv))
{
- if ((pcmds = array_cell (pcv)) && array_num_elements (pcmds) > 0)
- execute_array_command (pcmds, "PROMPT_COMMAND");
+ if ((pcmds = array_cell (cv)) && array_num_elements (pcmds) > 0)
+ execute_array_command (pcmds, varname);
return;
}
- else if (assoc_p (pcv))
+ else if (assoc_p (cv))
return; /* currently don't allow associative arrays here */
#endif
- command_to_execute = value_cell (pcv);
+ command_to_execute = value_cell (cv);
if (command_to_execute && *command_to_execute)
- execute_variable_command (command_to_execute, "PROMPT_COMMAND");
+ execute_variable_command (command_to_execute, varname);
}
/* Call the YACC-generated parser and return the status of the parse.
@@ -337,7 +341,7 @@ parse_command ()
#if defined (READLINE)
if (no_line_editing || (bash_input.type == st_stdin && parser_will_prompt ()))
#endif
- execute_prompt_command ();
+ process_variable_command ("PROMPT_COMMAND");
if (running_under_emacs == 2)
send_pwd_to_eterm (); /* Yuck */
@@ -351,7 +355,6 @@ parse_command ()
return (r);
}
-
/* Read and parse a command, returning the status of the parse. The command
is left in the globval variable GLOBAL_COMMAND for use by reader_loop.
This is where the shell timeout code is executed. */
@@ -398,3 +401,44 @@ read_command ()
return (result);
}
+
+/* export_command makes an array "CMD" and fills its fields
+ with the command line of "command" (only for cm_simple,
+ for cm_connection the last command in the chain is used */
+
+void
+export_command (COMMAND *command)
+{
+ int i = 0;
+ SHELL_VAR *cmd_var;
+ ARRAY *cmd_array;
+ WORD_LIST *list;
+
+ if (command->type == cm_simple)
+ list = command->value.Simple->words;
+ else if (command->type == cm_connection)
+ {
+ if (!command->value.Connection->second)
+ return;
+ while (command->type == cm_connection)
+ command = command->value.Connection->second;
+ if (command->type == cm_simple)
+ list = command->value.Simple->words;
+ else
+ return;
+ }
+ else
+ return;
+
+ cmd_var = make_new_array_variable ("CMD");
+ cmd_array = array_cell (cmd_var);
+
+ while (list)
+ {
+ array_insert (cmd_array, i, list->word->word);
+ list=list->next;
+ i++;
+ }
+
+ VSETATTR (cmd_var, (att_exported));
+}