Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I thought /bin/sh was a symlink to my shell of choice. I've always used bash, so I assumed that /bin/sh would point to /bin/bash. It turns out, though, that it points to /bin/dash.

It gets funnier. I start dash and do echo $SHELL and it prints /bin/bash (so they're basically the same?). However, the man page of dash is completely different from the man page of bash (so they're not the same?).

share|improve this question
1  
@wzzrd, Is this question linux-specific? –  aioobe Oct 21 '10 at 7:54
1  
sigh, I can't upvote all of these nice answers, since I need 15 rep. I feel handicapped as I have 18k on stackoverflow :-/ –  aioobe Oct 21 '10 at 8:03
3  
mmm dash.. what about /bin/crash (for gdb fans), /bin/slash (an austerity program), /bin/mash (hard times in Korea), /bin/sash (for cheerleaders), /bin/thrash (hard on your HDD), /bin/flash (but only if you encrypt your data), /bin/stash (good luck finding it later), /bin/cash (you're always in-the-money), /bin/pash (romancing the PC), /bin/gash (aaargggh!). –  PP. Oct 21 '10 at 8:11
1  
@PP - I'd read /bin/thrash for Metal music fans, and /bin/slash for fans of 80's rock band lead guitarists... :-P –  gWaldo Oct 21 '10 at 12:12
1  
The reason echo $SHELL prints /bin/bash is because that variable is set for the default shell that starts when you login rather than the current shell you're running. Start ksh or zsh from a Bash prompt and echo $SHELL will still say /bin/bash. Use ps to see what's currently running. –  Dennis Williamson Oct 21 '10 at 15:38

4 Answers 4

up vote 32 down vote accepted

Debian and Ubuntu switched to dash (iirc) because of a couple of things. First of all, Bash has become big over the years. In fact, the /bin/bash binary on my Ubuntu 8.04 system is almost ten times (!) as big as /bin/dash. Now, that does not matter much for day to day shell use, but it does matter in the following situations:

  • Dash is much smaller and thus loads faster, which is a boon for init-scripts. If you have to start a lot of them, loading Dash instead of Bash each time, speeds things up considerably.
  • Because of the smaller size of Dash, Debian and Ubuntu are able to shave off a pretty big chunk of the size of their initrd, leaving more room for other stuff (and again, speeding things up).

The downside of using Dash instead of Bash for scripting, is that a lot of people use syntactical niceties only Bash has, the so-called Bashisms. Examples of Bashisms are substrings, like this:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

And this:

echo ${a#123}
4567890

Dash, on the other hand mainly aims to be POSIX compliant (and no more than that), will give you a Bad substition error if you try this:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

This will matter if you use /bin/sh (and therefore dash) as the interpreter for your shellscripts and use Bashisms in them. Debian and Ubuntu have nice wiki pages about Bashisms and why they are bad in shellscripts in general and init-scripts in particular. Therefore, you should consciously choose whether you need /bin/sh or /bin/bash as the interpreter for your script.

Dash is not supposed to be used as the default shell on your systems. Just use Bash for that. For portability of your scripts, you can use Dash as the interpreter to increase the odds the scripts will run on other Linux flavors and Unixes.

share|improve this answer
2  
Good answer. Very educational. –  gWaldo Oct 21 '10 at 12:16
1  
If you write scripts with Bashisms, please specify /bin/bash; many non-Linux systems have actual sh shells which aren't even close to compatible with bash. –  Chris S Oct 21 '10 at 15:49

Take a look here: https://wiki.ubuntu.com/DashAsBinSh maybe It will help.

share|improve this answer

dash is a lightweight bash replacement, im assuming you use ubuntu which changed to it a few years ago.

Its not overly good though, imho. http://forums.debian.net/viewtopic.php?f=20&t=45116

share|improve this answer

Since not all shells set $SHELL when run, you find out your current shell with:

echo $0

If it gives an error, it's csh, otherwise it's the argv[0] you were invoked with, which is typically the shell, perhaps with a leading - hyphen, to indicate that it's a login shell.

This isn't guaranteed, since argv[0] is under the control of the invoking process, but it is in practice the most reliable approach.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.