Linux: What is Dash ( /bin/dash ) Shell?

What is /bin/dash? I noticed that the default system shell /bin/sh was changed to /bin/dash. Why was this change made?

Dash is an acronym for Debian Almquist shell (dash). It is a Unix and Linux shell which is much smaller than bash but still aiming at POSIX-compliancy. dash is a POSIX-compliant implementation of /bin/sh that aims to be as small as possible. dash is a direct descendant of the NetBSD version of ash (the Almquist SHell), ported to Linux in early 1997. It was renamed to dash in 2002.

From the dash man page:

dash is the standard command interpreter for the Linux system. The current version of dash is in the process of being changed to conform with the POSIX 1003.2 and 1003.2a specifications for the shell. This version has many features which make it appear similar in some respects to the Korn shell, but it is not a Korn shell clone. Only features designated by POSIX, plus a few Berkeley extensions, are being incorporated into this shell.

Starting with DebianSqueeze and Ubuntu 6.10, the default shell will be dash. The default system shell, /bin/sh, was changed to /bin/dash due to the following technical reasons:

  1. To speed up the system boot time. The reason is that dash starts faster than bash, and the shell is started quite a lot of times during boot. Measurements showed that they run equally fast, so the improved boot time must be due to dash doing less work during initialization.
  2. It requires less disk space but is also less feature-rich.
  3. It depends on fewer libraries.
  4. It is believed to be more reliable in the case of upgrade problems or disk failures.

A Note About Bash Specific Scripts

It is recommend that to avoid errors with your own Bash-specific scripts you can use the shebang line as follows:
#!/usr/bin/env bash.
However, Ubuntu wiki recommends that:

Developers of shell scripts adhere to the POSIX standard, omitting those items flagged as XSI extensions. Doing so will improve portability to a variety of Unix systems, and will provide assurance that problems you encounter will be treated as bugs rather than as undocumented features.

Test all your scripts and see if they will break once /bin/sh defaults to /bin/dash using virtualization or test machine.


🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.

🐧 4 comments so far... add one

CategoryList of Unix and Linux commands
Disk space analyzersncdu pydf
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network UtilitiesNetHogs dig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
4 comments… add one
  • JackS May 30, 2011 @ 6:28


    you can use checkbashisms to spot if your scripts can work under dash.

    or. under debian/ubuntu aptitude install devscripts

  • Change for the Sake of Change Jun 6, 2011 @ 18:20

    Anybody else getting tired of Ubuntu making radical changes to the OS with each release? Changes to the desktop is one thing but internals like the system shell, init scripts, inittab, and the list goes on.. seem to me like change for the sake of change. Having the system boot a couple seconds faster holds absolutely no value to me in light of the fact that I pay the price of no longer having easy access to bash and also having to re-evaluate all my scripts now. So what’s next? Maybe eliminating the whole /etc directory? I’m sure that has to be on the list somewhere.

  • Anthony Thyssen Jun 9, 2011 @ 13:35

    Dash being used to speed up the system scripts is fine. But as a user you can specif some other shell as the shell to use.

    However on point that dash does loose compliance in is that it only allows 1 digit file descriptors! That is you can not open a file descriptor numbered 10 or above.

    For example this fails, and it is POSIX compliant.
    $ exec 10>log_file
    exec: 1: 10: not found

    • Timothy Danielson Aug 8, 2014 @ 21:07

      I am new to Linux and to Debian… so I honestly didn;t understand what you said and am thibking “Huh?” and “What did he Mean?”

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre> for code samples. Still have questions? Post it on our forum