On Mon, Dec 12, 2022, at 4:43 AM, L A Walsh wrote:
> On 2022/12/11 20:47, Lawrence Velázquez wrote:
>> This happens because "declare"/"typeset" creates local variables
>> within functions.  Using -g works around this...
>>
>>      $ Export() { declare -gx "$@"; }
>>      $ Export -r foo=1
>>      $ declare -p foo
>>      declare -rx foo="1"
>>
>> ...but now "Export" always creates global variables, rather than
>> scoping as "declare" and your alias-based version does.  On the
>> other hand, "export" also creates global variables, so in a sense
>> the workaround version is more consistent.
>>
>>      $ f() { export "$@"; }
>>      $ f var=1
>>      $ declare -p var
>>      declare -x var="1"
>>   
> ----
> I see, but you still can't use "-r" w/export

Of course not.  I only meant to demonstrate that "export" always
creates global variables, so a function that utilizes "declare -gx"
actually behaves more like "export" then your alias does.


> though I think the -r flag would get dropped in any exported shell

The environment does not propagate the readonly attribute, no.


> though
> in that case, one might expect an error if one uses "typeset -xr"
> along the lines of "-r flag won't be exported".

The readonly attribute is still applied to the original shell
variable, so there's no reason to produce an error.


> Side curious: If one uses -g, does it cause the var to be defined
> in all intervening functions as well as the top(global)
> and current scope?

It defines a global variable, which is then visible to all functions.


-- 
vq

Reply via email to