* set temporary environment variables for builtins @ 2023-12-16 17:59 Clinton Bunch 2023-12-16 18:53 ` Lawrence Velázquez 0 siblings, 1 reply; 11+ messages in thread From: Clinton Bunch @ 2023-12-16 17:59 UTC (permalink / raw) To: zsh-users I was playing around with date formats using print -P and tried to get the time in Paris. This didn't work: TZ=Europe/Paris print -P '%D{%Y%m%dT%H%M%S%z}' This does: export TZ=Europe/Paris print -P '%D{%Y%m%dT%H%M%S%z}' but I have to unset/restore TZ afterwards. I also tried: () { typeset -x TZ=Europe/Paris; print -P '%D{%Y%m%dT%H%M%S%z}' } It left me with TZ set. I know this can be done with the date command, but it's one of those things that went from "Let's try this" to "Surely, there's a way to do this" Is this a bug or design decision? echo $ZSH_VERSION $ZSH_PATCHLEVEL $OSTYPE 5.8 zsh-5.8-0-g77d203f linux-gnu cat /etc/system-release Rocky Linux release 9.3 (Blue Onyx) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 17:59 set temporary environment variables for builtins Clinton Bunch @ 2023-12-16 18:53 ` Lawrence Velázquez 2023-12-16 19:48 ` Clinton Bunch 0 siblings, 1 reply; 11+ messages in thread From: Lawrence Velázquez @ 2023-12-16 18:53 UTC (permalink / raw) To: Clinton Bunch; +Cc: zsh-users On Sat, Dec 16, 2023, at 12:59 PM, Clinton Bunch wrote: > I also tried: > > () { typeset -x TZ=Europe/Paris; print -P '%D{%Y%m%dT%H%M%S%z}' } > > It left me with TZ set. With GLOBAL_EXPORT enabled (which is the default), ''typeset -x'' acts like ''typeset -gx''. Use ''local -x''. % typeset -p TZ typeset: no such variable: TZ % () { local -x TZ=Europe/Paris; print -P '%D{%z}' } +0100 % typeset -p TZ typeset: no such variable: TZ -- vq ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 18:53 ` Lawrence Velázquez @ 2023-12-16 19:48 ` Clinton Bunch 2023-12-16 20:20 ` Bart Schaefer 2023-12-16 20:21 ` Lawrence Velázquez 0 siblings, 2 replies; 11+ messages in thread From: Clinton Bunch @ 2023-12-16 19:48 UTC (permalink / raw) To: zsh-users Thanks. That worked. Still wondering why the standard syntax for setting a temporary environment variable doesn't work for builtins. I don't think I'm unusual in expecting this to work: TZ=Europe/Paris print -P '%D{%z}' Granted this is much more likely something someone would use with TZ=UTC. On 12/16/2023 12:53 PM, Lawrence Velázquez wrote: > On Sat, Dec 16, 2023, at 12:59 PM, Clinton Bunch wrote: >> I also tried: >> >> () { typeset -x TZ=Europe/Paris; print -P '%D{%Y%m%dT%H%M%S%z}' } >> >> It left me with TZ set. > With GLOBAL_EXPORT enabled (which is the default), ''typeset -x'' > acts like ''typeset -gx''. Use ''local -x''. > > % typeset -p TZ > typeset: no such variable: TZ > % () { local -x TZ=Europe/Paris; print -P '%D{%z}' } > +0100 > % typeset -p TZ > typeset: no such variable: TZ > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 19:48 ` Clinton Bunch @ 2023-12-16 20:20 ` Bart Schaefer 2023-12-16 20:21 ` Lawrence Velázquez 1 sibling, 0 replies; 11+ messages in thread From: Bart Schaefer @ 2023-12-16 20:20 UTC (permalink / raw) To: zsh-users On Sat, Dec 16, 2023 at 11:48 AM Clinton Bunch <cdb_zsh@zentaur.org> wrote: > > Still wondering why the standard syntax for setting a temporary > environment variable doesn't work for builtins. > > I don't think I'm unusual in expecting this to work: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01 (2.9.1 Simple Commands) "If the command name is not a special built-in utility or function, the variable assignments shall be exported for the execution environment of the command and (my emphasis) shall not affect the current execution environment except as a side-effect of the expansions performed in step 4" "print" is not a "special" built-in, so "shall not affect" applies. "Step 4" is "Each variable assignment shall be expanded for tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal prior to assigning the value." ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 19:48 ` Clinton Bunch 2023-12-16 20:20 ` Bart Schaefer @ 2023-12-16 20:21 ` Lawrence Velázquez 2023-12-16 20:27 ` Bart Schaefer 1 sibling, 1 reply; 11+ messages in thread From: Lawrence Velázquez @ 2023-12-16 20:21 UTC (permalink / raw) To: Clinton Bunch; +Cc: zsh-users On Sat, Dec 16, 2023, at 2:48 PM, Clinton Bunch wrote: > Still wondering why the standard syntax for setting a temporary > environment variable doesn't work for builtins. It does work, in general. % print -P '%D{%B}' December % LC_TIME=fr_FR.UTF-8 print -P '%D{%B}' décembre % print -r -- $LC_TIME % > I don't think I'm unusual in expecting this to work: > > TZ=Europe/Paris print -P '%D{%z}' The issue might be unique to TZ or TZ + print, but I'll defer to someone who actually has a clue (or has time to unearth one). -- vq ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 20:21 ` Lawrence Velázquez @ 2023-12-16 20:27 ` Bart Schaefer 2023-12-16 20:31 ` Roman Perepelitsa 2023-12-17 0:26 ` Lawrence Velázquez 0 siblings, 2 replies; 11+ messages in thread From: Bart Schaefer @ 2023-12-16 20:27 UTC (permalink / raw) To: Lawrence Velázquez; +Cc: Clinton Bunch, zsh-users On Sat, Dec 16, 2023 at 12:22 PM Lawrence Velázquez <larryv@zsh.org> wrote: > > It does work, in general. Well, no, it doesn't. It works for parameters that zsh separately considers to be "special", which includes all the LC_* variants. TZ is not special. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 20:27 ` Bart Schaefer @ 2023-12-16 20:31 ` Roman Perepelitsa 2023-12-16 20:35 ` Bart Schaefer 2023-12-16 23:53 ` Mikael Magnusson 2023-12-17 0:26 ` Lawrence Velázquez 1 sibling, 2 replies; 11+ messages in thread From: Roman Perepelitsa @ 2023-12-16 20:31 UTC (permalink / raw) To: Bart Schaefer; +Cc: Lawrence Velázquez, Clinton Bunch, zsh-users On Sat, Dec 16, 2023 at 9:28 PM Bart Schaefer <schaefer@brasslantern.com> wrote: > > On Sat, Dec 16, 2023 at 12:22 PM Lawrence Velázquez <larryv@zsh.org> wrote: > > > > It does work, in general. > > Well, no, it doesn't. It works for parameters that zsh separately > considers to be "special", which includes all the LC_* variants. TZ > is not special. In which sense is LC_TIME special for print but TZ is not? Roman. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 20:31 ` Roman Perepelitsa @ 2023-12-16 20:35 ` Bart Schaefer 2023-12-16 23:53 ` Mikael Magnusson 1 sibling, 0 replies; 11+ messages in thread From: Bart Schaefer @ 2023-12-16 20:35 UTC (permalink / raw) To: Roman Perepelitsa; +Cc: Lawrence Velázquez, Clinton Bunch, zsh-users On Sat, Dec 16, 2023 at 12:32 PM Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote: > > In which sense is LC_TIME special for print but TZ is not? In the sense that LC_* are always special, as noted by the <S> notation in "man zshparam". ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 20:31 ` Roman Perepelitsa 2023-12-16 20:35 ` Bart Schaefer @ 2023-12-16 23:53 ` Mikael Magnusson 1 sibling, 0 replies; 11+ messages in thread From: Mikael Magnusson @ 2023-12-16 23:53 UTC (permalink / raw) To: Roman Perepelitsa; +Cc: zsh-users On 12/16/23, Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote: > On Sat, Dec 16, 2023 at 9:28 PM Bart Schaefer <schaefer@brasslantern.com> > wrote: >> >> On Sat, Dec 16, 2023 at 12:22 PM Lawrence Velázquez <larryv@zsh.org> >> wrote: >> > >> > It does work, in general. >> >> Well, no, it doesn't. It works for parameters that zsh separately >> considers to be "special", which includes all the LC_* variants. TZ >> is not special. > > In which sense is LC_TIME special for print but TZ is not? Setting any of the LC_* parameters explicitly calls some locale stuff (whether or not it is exported), apart from just setting the parameters: /**/ void lcsetfn(Param pm, char *x) { char *x2; struct localename *ln; strsetfn(pm, x); if ((x2 = getsparam("LC_ALL")) && *x2) return; queue_signals(); /* Treat empty LC_* the same as unset. */ if (!x || !*x) x = getsparam("LANG"); /* * If we've got no non-empty string at this * point (after checking $LANG, too), * we shouldn't bother setting anything. */ if (x && *x) { for (ln = lc_names; ln->name; ln++) if (!strcmp(ln->name, pm->node.nam)) setlocale(ln->category, unmeta(x)); } unqueue_signals(); clear_mbstate(); /* LC_CTYPE may have changed */ inittyptab(); } -- Mikael Magnusson ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-16 20:27 ` Bart Schaefer 2023-12-16 20:31 ` Roman Perepelitsa @ 2023-12-17 0:26 ` Lawrence Velázquez 2023-12-17 7:54 ` Roman Perepelitsa 1 sibling, 1 reply; 11+ messages in thread From: Lawrence Velázquez @ 2023-12-17 0:26 UTC (permalink / raw) To: Bart Schaefer; +Cc: Clinton Bunch, zsh-users On Sat, Dec 16, 2023, at 3:27 PM, Bart Schaefer wrote: > On Sat, Dec 16, 2023 at 12:22 PM Lawrence Velázquez <larryv@zsh.org> wrote: >> >> It does work, in general. > > Well, no, it doesn't. It works for parameters that zsh separately > considers to be "special", which includes all the LC_* variants. TZ > is not special. Huh, this is very surprising to me. I guess I never noticed because almost all the variables that can influence builtins (e.g., CDPATH, LC_*, OPTIND, etc.) are special. -- vq ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: set temporary environment variables for builtins 2023-12-17 0:26 ` Lawrence Velázquez @ 2023-12-17 7:54 ` Roman Perepelitsa 0 siblings, 0 replies; 11+ messages in thread From: Roman Perepelitsa @ 2023-12-17 7:54 UTC (permalink / raw) To: Lawrence Velázquez; +Cc: Bart Schaefer, Clinton Bunch, zsh-users On Sun, Dec 17, 2023 at 1:27 AM Lawrence Velázquez <larryv@zsh.org> wrote: > > On Sat, Dec 16, 2023, at 3:27 PM, Bart Schaefer wrote: > > On Sat, Dec 16, 2023 at 12:22 PM Lawrence Velázquez <larryv@zsh.org> wrote: > >> > >> It does work, in general. > > > > Well, no, it doesn't. It works for parameters that zsh separately > > considers to be "special", which includes all the LC_* variants. TZ > > is not special. > > Huh, this is very surprising to me. I guess I never noticed because > almost all the variables that can influence builtins (e.g., CDPATH, > LC_*, OPTIND, etc.) are special. I am also surprised by this. It does make sense given the implementation details but it's not how I expected zsh to behave. Would it make sense to make all parameters that affect builtins special? Are there parameters other than TZ that affect builtins but aren't already special? Roman. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-12-17 11:36 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-12-16 17:59 set temporary environment variables for builtins Clinton Bunch 2023-12-16 18:53 ` Lawrence Velázquez 2023-12-16 19:48 ` Clinton Bunch 2023-12-16 20:20 ` Bart Schaefer 2023-12-16 20:21 ` Lawrence Velázquez 2023-12-16 20:27 ` Bart Schaefer 2023-12-16 20:31 ` Roman Perepelitsa 2023-12-16 20:35 ` Bart Schaefer 2023-12-16 23:53 ` Mikael Magnusson 2023-12-17 0:26 ` Lawrence Velázquez 2023-12-17 7:54 ` Roman Perepelitsa
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).