[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: declare -g var should return a nonzero return code when it fails
From: |
Chet Ramey |
Subject: |
Re: declare -g var should return a nonzero return code when it fails |
Date: |
Sat, 02 Nov 2013 12:51:21 -0400 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.0.1 |
On 11/1/13, 12:37 AM, Peggy Russell wrote:
> Hi,
>
> "declare -g var" should return a nonzero return code when it fails.
>
> Declaring a local variable as global in a function, has a exit status of 0,
> but the operation was not successful (see test_error). "help declare" and
> the bash man page indicate the exit status will indicate success or failure.
There is a problem here, and the problem that causes the spurious error
message from test_error has been fixed in bash-4.3. However, I don't think
you completely understand what bash scoping is, or what makes a variable
set or unset.
First, using declare without assigning a value creates a variable
"placeholder". The variable exists as more-or-less invisible, but is not
considered set until it is assigned a value. Therefore, declare -g var
just creates a placeholder at the global scope if there is no existing
global variable with that name. If there is such a variable, it's a
no-op. The `redeclare local variable as global' comment is just incorrect.
Second, declaring a variable, even a placeholder, at the global scope does
nothing to a variable with the same name at the local scope. Bash's
scoping rules mean that it will use a local variable instead of a global
variable if there is a local variable declared in the currently-executing
function. That's why the assignments of "data2" and "data3" affect the
local variable and disappear when the function returns.
> The "declare -g var", did not just fail with a return code of 0, but it
> also removed the variable from the environment. Isn't that grounds for
> a nonzero return code...
That's a bug in bash-4.2. The correct output is
test_success: rc [0]
declare -- var="data1"
== test_success: [data1]
./x2: line 27: declare: var: not found
test_error: rc [0]
declare -- var="data2"
test_error: rc [0]
declare -- var="data2"
declare -- var="data3"
== test_error: []
Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU chet@case.edu http://cnswww.cns.cwru.edu/~chet/