On Wed, Oct 19, 2016 at 11:53:37PM +0200, Martijn Dekker wrote: [...] > Assigning to BASHPID most certainly does have an effect. Since you > didn't quote that part, I think you might have missed my point that > attempting this will silently exit the shell without any error message, > causing the problem to be hard to track down. This is different from > GROUPS and FUNCNAME, where the shell silently continues (causing the > problem to be hard to track down in a completely different way -- if > anything, that's worse!).
I think he did get your point. There's definitely a bug here. It should be either: 1. BASHPID is readonly, therefore assignment to it is fatal and the script exits (with an error message printed). That's what my previous patch did. 2. BASHPID is not read-only, but changes to it are discarded (with the null assignement function). Assignments to BASHPID are non-fatal, and it's possible to unset it. Once it's unset, it's magical meaning is lost. (I think this is what Chet is proposing). noro_bashpid.patch > In what possible context would assigning to any of these variables make > sense, or be an indication of anything other than a fatal bug in the > script? I think they should all be readonly, and produce a proper > diagnostic error message upon exit if assigning is attempted. [...] I wonder the same thing. I don't understand the reasoning for picking (2). -- Eduardo Bustamante https://dualbus.me/
diff --git a/variables.c b/variables.c index 2e8b38c..5120f2e 100644 --- a/variables.c +++ b/variables.c @@ -1462,7 +1462,7 @@ get_bashpid (var) p = itos (pid); FREE (value_cell (var)); - VSETATTR (var, att_integer|att_readonly); + VSETATTR (var, att_integer); var_setvalue (var, p); return (var); } @@ -1767,7 +1767,7 @@ initialize_dynamic_variables () VSETATTR (v, att_integer); INIT_DYNAMIC_VAR ("BASHPID", (char *)NULL, get_bashpid, null_assign); - VSETATTR (v, att_integer|att_readonly); + VSETATTR (v, att_integer); #if defined (HISTORY) INIT_DYNAMIC_VAR ("HISTCMD", (char *)NULL, get_histcmd, (sh_var_assign_func_t *)NULL);