A couple of remarks / additions:
Quote:
Originally Posted by
Corona688
I doubt -- and hope -- their ksh isn't 100% compatible, since Solaris' usual idea of backwards compatibility is denying you all future features in the standard /bin/whatever, making you use /crazy/path/to/modern/whatever if you want them. Any shell that calls itself a Bourne shell, including bash, dash, ksh, pdksh, ash, and a few others are supposed to handle the standard Bourne features. The primary difference between bash and ksh is the way they handle arrays. In bash you do VAR=( a b c d e f ), in ksh you do set -a VAR ...
In ksh88, yes but in ksh93 arrays can also be set like
VAR=( a b c d e f )
Quote:
Another major difference is the order they handle pipes. In Bourne shells, echo asdf | read VAR won't work because 'read' will end up in a subshell, but in KSH that order is reversed -- the rightmost thing ends up in your local shell. This is a handy feature but profoundly not how Bourne shell handles it, so KSH could be considered incompatible that way... could conceivably alter the meaning of some code.
The order is not reversed. In most Bourne derived shells both LHS and RHS end up in a subshell. In ksh the RHS ends up in the local shell. Bash 4 also has an option to accomplish this.. The POSIX specification allows for both types of behavior.
Quote:
ksh also has the ability to handle floating point numbers, which bash and sh don't.
ksh93 does, ksh88 does not.
Quote:
For the most part if you stick to strict sh code, it will work great in all three shells.
What is meant with "strict sh" code. I would say best is to stick with what is the POSIX shell specification and on most modern Unix/Linux systems
/bin/sh is compliant with these specifications (except Solaris <=10 where /bin/sh is a strict pre-POSIX Bourne shell and the POSIX compliant shell is /usr/xpg4/bin/sh, or mostly compliant on some Linux distributions). The POSIX shell is more ksh derived than Bourne shell derived (although ksh is mostly Bourne shell derived itself and ksh88 itself is not POSIX compliant, but ksh93 is).
Quote:
Some really nice things that vanilla sh doesn't have and its descendents generally do include
- String operations, so you can do echo ${string:offset:length} instead of echo $string | cut
- var=$(command) instead of var=`command`, since $( ) nest properly and never split
- Mathematics with VAR=$((A+B)) instead of let VAR=A+B
- Better and more complex conditionals with if [[ ... ]] instead of if [ ... ]
All these features are becoming more and more standard now. There's just a few holdouts left -- like Solaris' ancient crusty /bin/sh which AFAIK had none of the above for 'compatibility reasons'... If they're finally updating it, that's lovely.
- Some string operations are standard on all POSIX shells, but not some additional ones in bash and ksh93 like ${var/xxx/yy} or ${VAR:1:1}.
- var=$(command) is available on all POSIX shells
- Mathematics with VAR=$((A+B)) is standard on all POSIX shells.