Re: mksh: first impressions

2013-04-04 Thread Thorsten Glaser
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


Re: mksh: first impressions

2013-04-04 Thread Finn Thain

On Thu, 4 Apr 2013, Thorsten Glaser wrote:

 Finn Thain dixit:
 
 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

In concept at least, the mksh interpretation of exec : is consistent 
with the bash interpretation of a=foo : that is, : interpreted as 
builtin.

And the mksh interpretation of a=foo : is consistent with the bash 
interpretation of exec : -- that is, : interpreted as no command at 
all.

To my mind, neither mksh or bash is consistent with itself. (So many ways 
to do nothing!)

Does POSIX also mandate the effects of exec when applied to a special 
builtin command? I didn't find it in the opengroup.org documentation.

 
 Oh, and try mksh-static (on Debian) or roll your own;

Would be nice if the Gentoo ebuild implemented the static USE flag...

Finn