EF> Unsurprisingly, [ast-ksh] doesn't fork. EF> Does anyone know how those ksh's achieve that? kre> I haven't look at their sources, but I would assume they don't fork. I concur. The most probable way to achieve non-forking is not to fork.
EF> Are there any drawbacks? kre> [ash] already has code to attempt to do that, but it doesn't currently kre> work properly in all cases, so has been disabled (long ago). So it's probably hard to get right. To re-phrase my question: certain ksh's manage to perform thigs demanded to take place in a Subshell Environment without fork()ing, whereas all other shells known to me fork(). So I can think of three possibilities: 1. They are doing something extremely clever/ugly that only works in the context of ksh's foo-baz-something internals 2. They are doing something that mostly works, but has non-trivial issues, either violating POSIX or non-POSIX shell common sense. 3. They just got it right while no other shell has managed to do so. I would hope for 3. so one could plug that code (or concept) into ash. > Of course there is only a big speedup when the command is a shell builtin Or a function. Whereas, with a function, one could circumvent the problem by making the function assign the result to a global variable instead of printing it. > [As I understand it, the issue is with correct cleanup, especially in the > case of errors - nothing [i]n the sub-shell environ is allowed to affect > the parent shell, so anything in the cmd-sub that changes anything at all > has to be undone - fork() makes that simple to get right, exit() cleans > up everything...] Yes, of course. > that's what command substitution is for after all Yes. But although X is for Y after all, Z may as well achieve Y. I always like to learn new shell trickery. > But in some cases, depending upon exactly what the printf is doing, > there can be other ways. Yes, please? I'm generally interested in the subject, but the code in question here does IPv6 address mangling: normalizing to X::Y form, combining (base address, prefix length, relative address) triples into an address and the like. The printf's are like printf "%02X%02X:%02X%02X" "$@" or printf "%04X" 0x"$xyz" or printf "%0$(( 33 - ${#xyz} ))X" 0 or printf "%x" 0x"$(printf "%.4s" "${xyz}")" or printf "%.$(($2 / 4))s%s\n" "$1" "${3#$(printf "%.$(($2 / 4))s" "$3")}" (Yes, that's all part of real, working, tested code I wrote. I do declare it would take me some sec^Wmin^Wwhatever to re-understand it.)