From 49c6978dbbb717847344e7cef99e4ee26f56d234 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Mon, 1 Apr 2024 22:38:27 -0700 Subject: 52865: Documentation update for 52864 --- ChangeLog | 3 +++ Doc/Zsh/expn.yo | 13 +++++++------ Doc/Zsh/params.yo | 4 ++-- Etc/FAQ.yo | 20 +++++++++++--------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9476c50ab..643a33dac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2024-04-01 Bart Schaefer + * 52865: Doc/Zsh/expn.yo, Doc/Zsh/params.yo, Etc/FAQ.yo: + Documentation update for 52864 + * 52864: Src/lex.c, Src/subst.c, Test/D10nofork.ztst, Test/V10private.ztst: Change ${|var|...} to ${{var} ...}, limit local REPLY behavior to ${|...}, update tests. diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo index 0e121e784..7eade4a11 100644 --- a/Doc/Zsh/expn.yo +++ b/Doc/Zsh/expn.yo @@ -1937,13 +1937,14 @@ split on tt(IFS) unless the tt(SH_WORD_SPLIT) option is set. cindex(substitution, command, current shell) cindex(substitution, command, non forking) cindex(substitution, nofork) -Substitutions of the form `tt(${|)var(param)tt(|)...tt(})' are similar, +Substitutions of the form `tt(${{)var(param)tt(}) ...tt(})' are similar, except that the substitution is replaced by the value of the parameter named by var(param). No implicit save or restore applies to var(param) -except as noted for tt(REPLY), and var(param) should em(not) be declared -within the command. If, after evaluating the expression, var(param) -names an array, array expansion rules apply. However, tt(REPLY) is -always expanded in scalar context, even if assigned an array. +and var(param) should em(not) be declared within the command. No space +is allowed within `tt(${{)' and space or newline is required after +`tt({)var(param)tt(})'. The var(param) may include a subscript, and if, +after evaluating the expression, var(param) names an array, then array +expansion rules apply to the final substitution. A command enclosed in braces preceded by a dollar sign, and set off from the braces by whitespace, like `tt(${ )...tt( })', is replaced by its @@ -1954,7 +1955,7 @@ Word splitting does not apply unless tt(SH_WORD_SPLIT) is set, but a single trailing newline is stripped unless the substitution is enclosed in double quotes. -Note that because the `tt(${|)...tt(})' and `tt(${ )...tt( })' forms +Note that because `tt(${|)...tt(})' and the two related substitutions must be parsed at once as both string tokens and commands, all other braces (`tt({)' or `tt(})') within the command either must be quoted, or must appear in syntactically valid pairs, such as around complex diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index 9516c84de..02ce796a9 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -1032,8 +1032,8 @@ the shell. ) item(tt(cmdsubst))( Command substitution using of the tt(`)var(...)tt(`), -tt($+LPAR())var(...)tt(RPAR()), tt(${ )var(...)tt( }) or -tt(${|)var(...)tt(}) constructs. +tt($+LPAR())var(...)tt(RPAR()),tt(${{)var(name)tt(}) var(...)tt(}), +tt(${|)var(...)tt(}), or tt(${ )var(...)tt( }) constructs. ) item(tt(equalsubst))( The tt(=+LPAR())var(...)tt(RPAR()) form of process substitution. diff --git a/Etc/FAQ.yo b/Etc/FAQ.yo index 4d71c8f30..4e11637ea 100644 --- a/Etc/FAQ.yo +++ b/Etc/FAQ.yo @@ -1047,15 +1047,18 @@ label(211) ) Runs code in the current shell context and then substitutes mytt(${REPLY}). The result is not split into words unless the tt(SH_WORD_SPLIT) option - is set, for example by mytt(${=${| code }}). + is set, for example by mytt(${=${| code }}). mytt($REPLY) is a local + parameter within the substitution so its value in the surrounding scope + is not changed. eit() An extension to #1 verb( - ${|var| code } + ${{var} code } ) Runs code in the current shell and then substitutes mytt(${var}). If mytt(${var}) names an array, the result is an array of those elements, - but no further splitting is done without tt(SH_WORD_SPLIT). + but no further splitting is done without tt(SH_WORD_SPLIT). mytt(${var}) + is myem(not) local to the substitution. eit() The traditional ksh form, except that the closing mytt(;) may usually be omitted: @@ -1071,12 +1074,11 @@ label(211) In all three forms mytt(code) behaves myem(similarly) to an anonymous function invoked like: verb( - () { local REPLY; code } "$@" + () { code } "$@" ) - Thus, mytt($REPLY) is implicitly local and returns to its previous - value after the substitution ends, all other parameters declared from - inside the substitution are also local by default, and positional - parameters mytt($1), mytt($2), etc. are those of the calling context. + Thus, all parameters declared inside the substitution are local by + default, and positional parameters mytt($1), mytt($2), etc. are those + of the calling context. The most significant limitation is that braces (mytt({) and mytt(})) within the substitutions must either be in balanced pairs, or must be @@ -1096,7 +1098,7 @@ sect(Comparisons of forking and non-forking command substitution) bash and ksh, unquoted non-forking substitutions behave like parameter expansions with respect to the tt(SH_WORD_SPLIT) option. - Both of the mytt(${|...}) formats retain any trailing newlines, + Both mytt(${|...}) and mytt(${{var} ...}) retain any trailing newlines, except as handled by the tt(SH_WORD_SPLIT) option, consistent with mytt(${|...}) from mksh. mytt(${ command }) removes a single final newline, but mytt("${ command }") retains it. This differs from -- cgit 1.4.1