lib/readline/rlprivate.h
- new extern declarations for _rl_copy_undo_{entry,list}
+
+execute_cmd.c
+ - change execute_cond_node so that quoting the rhs of the =~
+ operator forces string matching, like the == and != operators
+
+ 5/23
+ ----
+redir.c
+ - add_undo_redirect now takes as an additional argument the type of
+ redirection we're trying to undo
+ - don't add a "preservation" redirection for fds > SHELL_FD_BASE if
+ the redirection is closing the fd
+
+ 5/24
+ ----
+subst.c
+ - make sure that parameter_brace_substring leaves this_command_name
+ set to either NULL or its previous value after setting it so that
+ arithmetic evaluation errors while expanding substring values
+ contain meaningful informationn
/* Static functions defined and used in this file. */
static void add_undo_close_redirect __P((int));
static void add_exec_redirect __P((REDIRECT *));
-static int add_undo_redirect __P((int));
+static int add_undo_redirect __P((int, enum r_instruction));
static int expandable_redirection_filename __P((REDIRECT *));
static int stdin_redirection __P((enum r_instruction, int));
static int do_redirection_internal __P((REDIRECT *, int));
redirector = redirect->redirector;
ri = redirect->instruction;
-if (redirect->flags & RX_INTERNAL)
- flags |= RX_INTERNAL;
+ if (redirect->flags & RX_INTERNAL)
+ flags |= RX_INTERNAL;
if (TRANSLATE_REDIRECT (ri))
{
{
/* Only setup to undo it if the thing to undo is active. */
if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1))
- add_undo_redirect (redirector);
+ add_undo_redirect (redirector, ri);
else
add_undo_close_redirect (redirector);
}
if (flags & RX_ACTIVE)
{
if (flags & RX_UNDOABLE)
- add_undo_redirect (2);
+ add_undo_redirect (2, ri);
if (dup2 (1, 2) < 0)
return (errno);
}
{
/* Only setup to undo it if the thing to undo is active. */
if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1))
- add_undo_redirect (redirector);
+ add_undo_redirect (redirector, ri);
else
add_undo_close_redirect (redirector);
}
{
/* Only setup to undo it if the thing to undo is active. */
if (fcntl (redirector, F_GETFD, 0) != -1)
- add_undo_redirect (redirector);
+ add_undo_redirect (redirector, ri);
else
add_undo_close_redirect (redirector);
}
if (flags & RX_ACTIVE)
{
if ((flags & RX_UNDOABLE) && (fcntl (redirector, F_GETFD, 0) != -1))
- add_undo_redirect (redirector);
+ add_undo_redirect (redirector, ri);
#if defined (BUFFERED_INPUT)
check_bash_input (redirector);
even if REDIRECTION_UNDO_LIST is discarded by the exec builtin
are also saved on EXEC_REDIRECTION_UNDO_LIST. */
static int
-add_undo_redirect (fd)
+add_undo_redirect (fd, ri)
int fd;
+ enum r_instruction ri;
{
int new_fd, clexec_flag;
REDIRECT *new_redirect, *closer, *dummy_redirect;
/* experimental: if we're saving a redirection to undo for a file descriptor
above SHELL_FD_BASE, add a redirection to be undone if the exec builtin
causes redirections to be discarded. */
- if (fd >= SHELL_FD_BASE)
+ if (fd >= SHELL_FD_BASE && ri != r_close_this)
{
rd.dest = new_fd;
new_redirect = make_redirection (fd, r_duplicating_output, rd);
{
intmax_t e1, e2;
int vtype, r, starsub;
- char *temp, *val, *tt;
+ char *temp, *val, *tt, *oname;
SHELL_VAR *v;
if (value == 0)
return ((char *)NULL);
+ oname = this_command_name;
this_command_name = varname;
vtype = get_var_and_type (varname, value, quoted, &v, &val);
if (vtype == -1)
- return ((char *)NULL);
+ {
+ this_command_name = oname;
+ return ((char *)NULL);
+ }
starsub = vtype & VT_STARSUB;
vtype &= ~VT_STARSUB;
r = verify_substring_values (val, substr, vtype, &e1, &e2);
+ this_command_name = oname;
if (r <= 0)
return ((r == 0) ? &expand_param_error : (char *)NULL);