Finn Thain dixit:
For some time I have been meaning to check out mksh, and your email
prompted me to install it. The first thing I noticed was how good the
documentation is (the bash man page is missing a lot of stuff).
Great! Most of the manual page was not written by me, mind you,
standing on the shoulders of giants and all that, but still
appreciated.
I played around with mksh for a while and noticed some other differences
with bash. Parameter assignment using here-docs is a nice feature. Another
difference is double logical complement. The mksh result was the one I was
expecting --
Ouch @bash. Well yes, it does have some odd corners, but this
one is definitely unexpected.
Another difference is parameter assignment --
[…]
$ a=foo exec /dev/stdin
I think this is a known POSIX violation in GNU bash (though,
some of those can be worked around by putting it into POSIX
mode); ormaaj can probably say more on that if interested.
The mksh man page says, the assignments are in effect only for the
duration of the command. In bash you might do,
Yes, that’s POSIX-mandated for special builtin utilities
or somesuch-worded.
So is : a NOP, or is it a builtin command? Beats me!
“:” is a builtin utility and the same as “true”, except
that “:” is “a POSIX special builtin” and “true” is
“a POSIX regular builtin” (see mkshbuiltins[] in funcs.c).
Anyway, I'm picking nits. Here's where the rubber hits the road:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12457 fthain20 0 3524 1872 1572 S 0.0 0.1 0:00.01 bash
12734 fthain20 0 2228 712 608 S 0.0 0.0 0:00.00 mksh
$ ls -l /bin/mksh /bin/bash
-rwxr-xr-x 1 root root 263860 Mar 29 12:51 /bin/mksh
-rwxr-xr-x 1 root root 720796 Sep 3 2012 /bin/bash
Don’t forget that GNU bash is probably dynamically linked
against libreadline and libncurses/libtermcap to boot.
Oh, and try mksh-static (on Debian) or roll your own;
on a Linux target, klibc (though you’ll need version 2.x
to get some bugfixes), dietlibc and bionic are all valid
targets (not µClibc, but that’s because it’s a horrid
bloated mess, not unlike (e)glibc itself). Just make sure
it passes the mksh testsuite (which is a good testsuite
for the compiler/toolchain/libc used, too – it finds more
bugs in those than in mksh; a recent example can be seen
at https://bugzilla.redhat.com/show_bug.cgi?id=922974 in
GCC, which is a known repeat offender).
Even without -DMKSH_SMALL it’s great – plus, not having to
do all the relocation and other stuff involved in dynamic
linking, there’s benefit, for example in the amount of CPU
instructions required to just run $SHELL -c true; read up
on http://k1024.org/~iusty/blog/entry/perf-null/ in case
you’re interested; tl;dr in cycles/instructions for shells:
bash 1680/1044K mksh 1258/942K dash 766/469K
mksh-static 502/322K (though with -DMKSH_SMALL), and that
was before my optimisations based on those numbers (e.g.
I did get the number of branch misses down *a lot*, as
well as the number of cycles for mksh-static.
So thanks for the excellent work!
You’re welcome!
bye,
//mirabilos
--
[DJBDNS Zone] TTL 86400 – Natureshadow kann man da auch 1d schreiben?
mirabilos nö, außerdem kann ein Deutscher oder ein Japaner mit 1d
ja erstmal nix anfangen, oder könntest du 1日 im zone file lesen?
Natureshadow das heißt für mich: ein Regal, das u.U. schiefstehen könnte