What are the differences between 'bash' and 'sh'

Hopefully this doesn't come off as too much of a "newbie" question or a flamebait. But I have recently begun working with a Sun Solaris box after having spent the past five years working with RedHat. From what i can tell, thing look fairly similar and the 'man' command is some help. But I've noticed that the default shell is 'sh' and I tend to be more familiar with 'bash' since that's the default in RedHat. I understand that the reason that 'sh' is the defatul for root is that it's statically compiled and available even if the /usr partition is unavailable. But there are features that I like that seem to be missing:
-Arrow up for command history
-Arrays or creating arrays like this: test1=( `ls` )
-Emacs style editing on the command line
Just to name a few. So my question is, how different is 'sh' from 'bash'. I imagine there are things I will have to rewrite in my bash scripts to get them to work under 'sh'. But how much work am I really in for? Are there any good resources online that will lay out the differences or good books that anyone would recommend? I love the O'Reilly book on Bash. Anything similar for 'sh'? Thanks

http://www.faqs.org/faqs/unix-faq/shell/shell-differences/

This FAQ lists the differences between a few different shells. About half-way down is a comparison of which functions are available/unavailable in the different shells.

In my opinion they are fairly close, but both have commands available to one and not the other, for example substring command is not supported in sh but is in bash ${TEST:$i:1} For arrays, in /sh you use the following syntax

${array} - accesses element 0
${array[i]} accessed element 0 - 1023
${array[*]} and ${array[@]} -uses all elements of the array (list), the difference in the two is that one set is quoted and the other isnt
You can skip the ${ } syntax in sh by using (( array[ ] ))

Personally, I think sh (actually ksh) is better suited for scripting (some may disagree...like I said, just my opinion).

If you want emacs set your EDITOR variable to use emacs. /sh by default uses vi...pretty easy to use once you struggle through the command syntax!!! Use set -o to see what options you have turned on.

To get your history, use ESC-j or ESC-k to scroll up or down. command expansion, hit ESC twice to expand what you are typing on command line. Like bash, you can use / to search your command history.

Plenty other differences Im sure, pick up O'Reilly - UNIX in a Nutshell to see all commands specific to sh.

If you like bash a lot, maybe you should just continue to use it. Solaris 8 includes bash in the full distrubution. And bash precompiled for Sun boxes is available at http://www.sunfreeware.com

google, I am facinated by what you said about setting the EDITOR variable to 'vi'. I tried this but was unable to make use of the ESC-i and ESC-k to peruse the history in 'sh'. I have a feeling I misunderstood something though. (I'm using Solaris 8 BTW) When you mentioned using 'vi', perhaps you weren't talking about editing commands at the 'sh' prompt? Thanks for everyones suggestions.

I am using HPUX 11.xx my shell is by default ksh

To see what options you have turned on, run the following command:
set -o

Output from my system gave me:
sh ---> set -o
Current option settings
allexport on
bgnice on
emacs off
errexit off
gmacs off
ignoreeof off
interactive on
keyword off
markdirs off
monitor on
noexec off
noclobber off
noglob off
nolog off
nounset on
privileged off
restricted off
trackall off
verbose off
vi on
viraw off
xtrace off
sh --->

If vi is not "on", you can turn it on by running the following command:
set -o vi

After that, verify its on by re-running set -o....then try using ESC-j and ESC-k to see command history..On HPUX at least, the command history and line expansion is a function of vi.

A nice difrentiation for the shells.

http://www.ugrad.cs.ubc.ca/~cs219/CourseNotes/Unix/shell-Differences.html

Thanks for the information everyone. This will be a big help! :slight_smile: