Re: Uxexpected complaint of "unbound variable"

2015-05-05 Thread Chet Ramey
On 5/4/15 9:03 PM, James Caccese wrote:
> I posted the following question to stackoverflow
> (http://stackoverflow.com/questions/30042157/why-cant-i-use-declare-r-inside-a-function-fo-mark-a-variable-readonly-while)
> and was advised the behavior I was witnessing was a bug in bash.

It's not a bug; it's an application of bash's scoping rules and the rules
about when a varible is not set.

> 
> With |GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)|,
> 
> |#! /bin/bash
> set -u
> 
> exec {FD1}>tmp1.txt
> declare -r FD1
> echo "fd1: $FD1"   # why does this work,

You create a global variable and modify its attributes.

> 
> function f1() {
>   exec {FD2}>tmp2.txt
>   readonly FD2
>   echo "fd2: $FD2" # this work,

You create a global variable and modify its attributes.

> }
> 
> f1
> 
> function f2() {
>   exec {FD3}>tmp3.txt
>   echo "fd3: $FD3" # and even this work,

You create a global variable.

>   declare -r FD3

You create a `placeholder' local variable that has no value, shadowing the
global variable.  When you use `declare' or its synonym `typeset' inside a
shell function, you create local variables.

The variable has no value, since you haven't assigned it one, and so is
technically unset.

>   echo "fd3: $FD3" # when this complains: "FD3: unbound variable"?

Scoping: the variable with that name in the closest scope is the (unset)
local copy of FD3.

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRUc...@case.eduhttp://cnswww.cns.cwru.edu/~chet/



Re: Possible bug in 'unset' builtin

2015-05-05 Thread Chet Ramey
On 5/1/15 2:26 PM, Dreamcat4 wrote:
> Hello.
> If you unset a function, then a variable argument (argv) specified after
> that function will not be unset.

Thanks for the report.  Yes, once you unset a function, it's as if you
supplied the `-f' option.

This came in as the result of a fix for the unset-lets-you-unset-readonly-
functions problem in bash-4.2.

> [19:24] < dualbus> for every fix that Chet does, he introduces like 2 bugs.
> Nice way of keeping himself busy

That points to the importance of having a good, comprehensive test suite.
It's difficult to test the interaction between features otherwise.

I attached a patch for people to test.
-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRUc...@case.eduhttp://cnswww.cns.cwru.edu/~chet/
*** ../bash-4.3-patched/builtins/set.def	2013-04-19 07:20:34.0 -0400
--- builtins/set.def	2015-05-05 13:25:36.0 -0400
***
*** 752,758 
--- 797,805 
  {
int unset_function, unset_variable, unset_array, opt, nameref, any_failed;
+   int global_unset_func, global_unset_var;
char *name;
  
unset_function = unset_variable = unset_array = nameref = any_failed = 0;
+   global_unset_func = global_unset_var = 0;
  
reset_internal_getopt ();
***
*** 762,769 
  	{
  	case 'f':
! 	  unset_function = 1;
  	  break;
  	case 'v':
! 	  unset_variable = 1;
  	  break;
  	case 'n':
--- 809,816 
  	{
  	case 'f':
! 	  global_unset_func = 1;
  	  break;
  	case 'v':
! 	  global_unset_var = 1;
  	  break;
  	case 'n':
***
*** 778,782 
list = loptend;
  
!   if (unset_function && unset_variable)
  {
builtin_error (_("cannot simultaneously unset a function and a variable"));
--- 825,829 
list = loptend;
  
!   if (global_unset_func && global_unset_var)
  {
builtin_error (_("cannot simultaneously unset a function and a variable"));
***
*** 796,799 
--- 843,849 
name = list->word->word;
  
+   unset_function = global_unset_func;
+   unset_variable = global_unset_var;
+ 
  #if defined (ARRAY_VARS)
unset_array = 0;


Re: bash --debugger on a script with no arguments

2015-05-05 Thread Chet Ramey
On 4/30/15 9:27 AM, Chet Ramey wrote:
> On 4/29/15 10:31 PM, Rocky Bernstein wrote:
> 
>>  $ ./bash --debugger -i /tmp/foo.sh
>> hi
>>
>>  $  ./bash --debugger /tmp/foo.sh
>> bash debugger, bashdb, release 4.3-0.91
>>
>> Copyright 2002, 2003, 2004, 2006-2012, 2014 Rocky Bernstein
>> This is free software, covered by the GNU General Public License, and you are
>> welcome to change it and/or distribute copies of it under certain conditions.
>>
>> (/tmp/foo.sh:2):
>> 2:echo "hi"
>> bashdb<0>
> 
> I'll have to look at this.  The bash-4.3 behavior was changed to solve
> this problem with running the debugger in an interactive shell:
> 
> http://lists.gnu.org/archive/html/bug-bash/2012-08/msg00028.html
> 
> That problem still exists with the version of bashdb installed by default
> on my Fedora 20 system.
> 
> It looks like testing for the presence of -i might solve it, but I will
> have to see.

It turned out to be a little more complicated than that, but I think I have
something that will result in the debugger being invoked only when the
shell is reading a shell script.  It will be in the next release.

Chet

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRUc...@case.eduhttp://cnswww.cns.cwru.edu/~chet/



Re: bash --debugger on a script with no arguments

2015-05-05 Thread Rocky Bernstein
On Tue, May 5, 2015 at 2:54 PM, Chet Ramey  wrote:

> On 4/30/15 9:27 AM, Chet Ramey wrote:
> > On 4/29/15 10:31 PM, Rocky Bernstein wrote:
> >
> >>  $ ./bash --debugger -i /tmp/foo.sh
> >> hi
> >>
> >>  $  ./bash --debugger /tmp/foo.sh
> >> bash debugger, bashdb, release 4.3-0.91
> >>
> >> Copyright 2002, 2003, 2004, 2006-2012, 2014 Rocky Bernstein
> >> This is free software, covered by the GNU General Public License, and
> you are
> >> welcome to change it and/or distribute copies of it under certain
> conditions.
> >>
> >> (/tmp/foo.sh:2):
> >> 2:echo "hi"
> >> bashdb<0>
> >
> > I'll have to look at this.  The bash-4.3 behavior was changed to solve
> > this problem with running the debugger in an interactive shell:
> >
> > http://lists.gnu.org/archive/html/bug-bash/2012-08/msg00028.html
> >
> > That problem still exists with the version of bashdb installed by default
> > on my Fedora 20 system.
> >
> > It looks like testing for the presence of -i might solve it, but I will
> > have to see.
>
> It turned out to be a little more complicated than that, but I think I have
> something that will result in the debugger being invoked only when the
> shell is reading a shell script.  It will be in the next release.
>

Again, thanks.


>
> Chet
>
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
>  ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, ITS, CWRUc...@case.edu
> http://cnswww.cns.cwru.edu/~chet/
>