zsh-workers
 help / color / mirror / code / Atom feed
* f() { local -ar path=(/bin); };f gives an error
@ 2017-11-26 23:21 Stephane Chazelas
  2017-11-26 23:28 ` Eric Cook
  0 siblings, 1 reply; 7+ messages in thread
From: Stephane Chazelas @ 2017-11-26 23:21 UTC (permalink / raw)
  To: Zsh hackers list

FYI,

someone reported this on unix.stackexchange.com:
https://unix.stackexchange.com/questions/407125/why-cant-i-define-a-readonly-variable-named-path-in-zsh

Which looks like a bug:

$ zsh -c 'f() { local -ar path=(/bin); }; f'
f: read-only variable: path
$ /zsh --version
zsh 5.4.2-dev-0 (x86_64-unknown-linux-gnu)

See also the answer there by someone would did some investigation already.

-- 
Stephane


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: f() { local -ar path=(/bin); };f gives an error
  2017-11-26 23:21 f() { local -ar path=(/bin); };f gives an error Stephane Chazelas
@ 2017-11-26 23:28 ` Eric Cook
  2017-11-27 20:17   ` Stephane Chazelas
  0 siblings, 1 reply; 7+ messages in thread
From: Eric Cook @ 2017-11-26 23:28 UTC (permalink / raw)
  To: zsh-workers

On 11/26/2017 06:21 PM, Stephane Chazelas wrote:
> FYI,
> 
> someone reported this on unix.stackexchange.com:
> https://unix.stackexchange.com/questions/407125/why-cant-i-define-a-readonly-variable-named-path-in-zsh
> 
> Which looks like a bug:
> 
> $ zsh -c 'f() { local -ar path=(/bin); }; f'
> f: read-only variable: path
> $ /zsh --version
> zsh 5.4.2-dev-0 (x86_64-unknown-linux-gnu)
> 
> See also the answer there by someone would did some investigation already.
> 
() { local -har path=(/foo); typeset -p path }
typeset -ar path=( /foo )

-h     Hide: only useful for special  parameters  (those  marked
       `<S>' in the table in zshparam(1)), and for local parame‐
       ters with the same name as a  special  parameter...


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: f() { local -ar path=(/bin); };f gives an error
  2017-11-26 23:28 ` Eric Cook
@ 2017-11-27 20:17   ` Stephane Chazelas
  2017-11-27 21:03     ` Eric Cook
  0 siblings, 1 reply; 7+ messages in thread
From: Stephane Chazelas @ 2017-11-27 20:17 UTC (permalink / raw)
  To: Eric Cook; +Cc: zsh-workers

2017-11-26 18:28:17 -0500, Eric Cook:
> On 11/26/2017 06:21 PM, Stephane Chazelas wrote:
> > FYI,
> > 
> > someone reported this on unix.stackexchange.com:
> > https://unix.stackexchange.com/questions/407125/why-cant-i-define-a-readonly-variable-named-path-in-zsh
> > 
> > Which looks like a bug:
> > 
> > $ zsh -c 'f() { local -ar path=(/bin); }; f'
> > f: read-only variable: path
> > $ /zsh --version
> > zsh 5.4.2-dev-0 (x86_64-unknown-linux-gnu)
> > 
> > See also the answer there by someone would did some investigation already.
> > 
> () { local -har path=(/foo); typeset -p path }
> typeset -ar path=( /foo )
> 
> -h     Hide: only useful for special  parameters  (those  marked
>        `<S>' in the table in zshparam(1)), and for local parame‐
>        ters with the same name as a  special  parameter...

Thanks.

But that creates a non-special local "path" variable.

The issue here is that when you're trying to make $path (the
special array variable tied to $PATH) readonly (with a value)
locally in a function, that doesn't work.

it also doesn't work with the scalar variant:

() { local -r PATH=/foo; }

same goes with the $cdpath/$CDPATH variable.

-- 
Stephane


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: f() { local -ar path=(/bin); };f gives an error
  2017-11-27 20:17   ` Stephane Chazelas
@ 2017-11-27 21:03     ` Eric Cook
  2017-11-27 21:34       ` Bart Schaefer
  0 siblings, 1 reply; 7+ messages in thread
From: Eric Cook @ 2017-11-27 21:03 UTC (permalink / raw)
  To: zsh-workers

On 11/27/2017 03:17 PM, Stephane Chazelas wrote:
> 
> Thanks.
> 
> But that creates a non-special local "path" variable.
> 
> The issue here is that when you're trying to make $path (the
> special array variable tied to $PATH) readonly (with a value)
> locally in a function, that doesn't work.
> 

That wasn't really asked by your original link. While not common, people do
ask in #zsh why after attempting to use an local (non-readonly)
variable named path to reference an filename or something, they can no longer
execute commands. Using typeset's -h option to hide the special attribute allows
them to do so, so setting it `42' like in the stackexchange link would work
without breaking other stuff.

But to actually allow what you are now asking, I'll defer to someone else.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: f() { local -ar path=(/bin); };f gives an error
  2017-11-27 21:03     ` Eric Cook
@ 2017-11-27 21:34       ` Bart Schaefer
  2017-11-27 21:35         ` Bart Schaefer
  2017-11-29 22:12         ` Stephane Chazelas
  0 siblings, 2 replies; 7+ messages in thread
From: Bart Schaefer @ 2017-11-27 21:34 UTC (permalink / raw)
  To: zsh-workers

> On 11/27/2017 03:17 PM, Stephane Chazelas wrote:
>>
>> The issue here is that when you're trying to make $path (the
>> special array variable tied to $PATH) readonly (with a value)
>> locally in a function, that doesn't work.

Something a little weird happens with order-of-operations for tied parameters:

f() { local -ar path; PATH=foo; echo $path }

Note there's no error there, $path is changed by the assignment to
$PATH even though the array is read-only.  The reverse also works; you
have to make both parameters read-only to prevent changing either one
by assignment to the other.

f() { path=(/bin); local -r path PATH; ... }  # achieves the desired effect


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: f() { local -ar path=(/bin); };f gives an error
  2017-11-27 21:34       ` Bart Schaefer
@ 2017-11-27 21:35         ` Bart Schaefer
  2017-11-29 22:12         ` Stephane Chazelas
  1 sibling, 0 replies; 7+ messages in thread
From: Bart Schaefer @ 2017-11-27 21:35 UTC (permalink / raw)
  To: zsh-workers

On Mon, Nov 27, 2017 at 1:34 PM, Bart Schaefer
<schaefer@brasslantern.com> wrote:
>
> f() { path=(/bin); local -r path PATH; ... }  # achieves the desired effect

Of course there's a missing "local" before the first assignment there.
Sorry about that.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: f() { local -ar path=(/bin); };f gives an error
  2017-11-27 21:34       ` Bart Schaefer
  2017-11-27 21:35         ` Bart Schaefer
@ 2017-11-29 22:12         ` Stephane Chazelas
  1 sibling, 0 replies; 7+ messages in thread
From: Stephane Chazelas @ 2017-11-29 22:12 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: zsh-workers

2017-11-27 13:34:05 -0800, Bart Schaefer:
> > On 11/27/2017 03:17 PM, Stephane Chazelas wrote:
> >>
> >> The issue here is that when you're trying to make $path (the
> >> special array variable tied to $PATH) readonly (with a value)
> >> locally in a function, that doesn't work.
> 
> Something a little weird happens with order-of-operations for tied parameters:
> 
> f() { local -ar path; PATH=foo; echo $path }
> 
> Note there's no error there, $path is changed by the assignment to
> $PATH even though the array is read-only.  The reverse also works; you
> have to make both parameters read-only to prevent changing either one
> by assignment to the other.
> 
> f() { path=(/bin); local -r path PATH; ... }  # achieves the desired effect

Wouldn't we want to propagate the "readonly" attribute to the
"tied" variable when the other one is made "readonly"?

There are other combinations that don't work so well like:

$ zsh -c 'typeset -Z3 -T A a; a=1; echo $A'
001
$ zsh -c 'typeset -T A a; typeset -Z3 A; a=(2 3); echo $a'
2 3
$ zsh -c 'typeset -T A a; typeset -Z3 A; A=1; echo $a'
1

-U is OK (often used with $PATH).

Would be worth going through all the combinations that one may
want to use and clarify which ones are legal which ones are not.

Having typeset return an error when two exclusive options are
used together (like typeset -iT (documented), typeset -ai (not))
would be helpful.

(why not allowing -i/-F/-Z... and most other scalar flags for
arrays and hashes btw?)

-- 
Stephane.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-11-29 22:12 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-26 23:21 f() { local -ar path=(/bin); };f gives an error Stephane Chazelas
2017-11-26 23:28 ` Eric Cook
2017-11-27 20:17   ` Stephane Chazelas
2017-11-27 21:03     ` Eric Cook
2017-11-27 21:34       ` Bart Schaefer
2017-11-27 21:35         ` Bart Schaefer
2017-11-29 22:12         ` Stephane Chazelas

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).