diff options
Diffstat (limited to 'Etc')
-rw-r--r-- | Etc/FAQ.yo | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/Etc/FAQ.yo b/Etc/FAQ.yo index 270a04608..7d46e9192 100644 --- a/Etc/FAQ.yo +++ b/Etc/FAQ.yo @@ -1067,6 +1067,44 @@ label(211) quoted, that is, included in a quoted string or prefixed by backslash. These substitutions first become usable after zsh 5.9. +sect(Comparisons of forking and non-forking command substitution) + + mytt(${ command }) and variants may change the caller's options by using + mytt(setopt) and may modify the caller's local parameters, including the + positional parameters mytt($1), mytt($2), etc., via both assignments and + mytt(set -- pos1 pos2 etc). Nothing that happens within mytt($(command)) + affects the caller. + + mytt($(command)) removes trailing newlines from the output of mytt(command) + when substituting, whereas mytt(${ command }) and its variants do not. + The latter is consistent with mytt(${|...}) from mksh but differs from + bash and ksh, so in emulation modes, newlines are stripped from command + output (not from mytt(REPLY) assignments). + + When mytt(command) is myem(not) a builtin, mytt(${ command }) does fork, and + typically forks the same number of times as mytt($(command)), because in + the latter case zsh usually optimizes the final fork into an exec. + + Redirecting input from files has subtle differences: + + mytt($(<file)) is optimized to read from mytt(file) without forking, but + per above it removes trailing newlines. + + mytt(${<file}) is a substitution error. + + mytt(${ <file }) copies mytt(file) using the mytt(NULLCMD) programs, then + reads and substitutes the contents of the copy. Also, this fails if the + mytt(CSH_NULLCMD) or mytt(SH_NULLCMD) options are in effect, so it does + not work in emulation modes. + + mytt(${|<file}) copies mytt(file) to the standard output using mytt(NULLCMD) + but substitutes nothing because there is no assignment to mytt(REPLY). It + fails in emulation modes. + + mytt(${|IFS= read -rd '' <file}) is therefore the best solution for files + that do not contain nul bytes, because it copies the file directly into + the local mytt(REPLY) and then substitutes that. + chapter(How to get various things to work) sect(Why does mytt($var) where mytt(var="foo bar") not do what I expect?) |