Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [PATCH] Improved implementation of ${{var} cmd} etc.
- X-seq: zsh-workers 52865
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: Re: [PATCH] Improved implementation of ${{var} cmd} etc.
- Date: Sat, 30 Mar 2024 20:47:18 -0700
- Archived-at: <https://zsh.org/workers/52865>
- In-reply-to: <CAH+w=7Zzdx22_VzkV88vuZUKuke38fLurBF_Gh+EdtkdGTyt4A@mail.gmail.com>
- List-id: <zsh-workers.zsh.org>
- References: <CAH+w=7Zzdx22_VzkV88vuZUKuke38fLurBF_Gh+EdtkdGTyt4A@mail.gmail.com>
On Sat, Mar 30, 2024 at 2:47 PM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
>
> ${{var} }, ${{var};}, ${{} }, etc., substitute the empty string rather
> than erroring.
${{var};} does error, that was a typo for ${{var} ;} with the space.
> This does not yet update the Doc
Doc patch attached. It wasn't as extensive a change as I feared.
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
Messages sorted by:
Reverse Date,
Date,
Thread,
Author