Bourne | Ash |  #!  | find | ARG_MAX | Shells | whatshell | portability | permissions | UUOC | ancient | - | ../Various | HOME
"$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale

Ash (Almquist Shell) Variants

2006-02-14 .. 2014-04-12 (see recent changes)

After I had repeatedly wondered how all those "ash" variants might be related, and had found hardly any information, I had a look at the variants I know.
Source is available for all variants, except for BSD/OS. Thanks to TUHS for archiving the traditional BSDs and 386BSD,
to Kirk McKusick for his CSRG archive, and to Peter Seebach for allowing me to learn all BSD/OS variants.

This page documents relationships. For the variants without changelogs (the traditional BSDs, 386BSD, BSD/OS and Minix) this page aims at being a complete log
(with emphasis on the source). For the other variants this was certainly not the goal and just some arbitrarily chosen changes or bugfixes are listed.


· 1.) Original release '89
· 2.) Traditional BSDs: 4.3BSD-Net/2 '91, 4.4BSD-Alpha '92, 4.4BSD '93, 4.4BSD-Lite '94, 4.4BSD-Lite2 '95
· 3.) 386BSD '92-'93
· 4.) BSD/OS (BSDi) '91-'03
· 5.) NetBSD '93-
· 6.) FreeBSD '96-
· 7.) early port from NetBSD to Linux '93   (and early Slackware, Debian)
· 8.) dash '97-    (and later Slackware)
· 9.) Slackware variant of dash '06-
· 10.) Android variant (derived from NetBSD) '05-
· 11.) Cygwin variants of ash '98-
· 12.) BusyBox '01-
· 13.) Minix '01-

Illustration of the family tree (click for an increased size).

1.) Original release ('89) - sh(1)

It was written by Kenneth Almquist as replacement to the traditional "System V Release 4" Bourne shell
due to the license war between AT&T and Berkeley. Berkeley distributed it first with "BSD 4.3-Net/2".
The source was posted to comp.sources.unix, "A reimplementation of the System V shell", on 30-05-1989.
Shortly after, Kenneth published a job control patch to fix the problem that more than 4 jobs were not handled properly.

Differences between the ash family and the SVR4 shell:

Common to ash variants and the SVR4 shell only, in contrast to other bourne compatible shells:

Details which are only found in early ash variants:

[1] In fact, no ash variant needs "case x in (x)" because the parser is robust about case constructs in $(...) command substitution.
However, several other shells are not robust and they have to work around this way; so this is a script portability issue.
It was, sooner or later, fixed in most implementations: BSD/OS 3.0 (06/'96), dash-0.3.5-4 (08/'99) (and thus Busybox and Slackware 8.1 ff.), FreeBSD 4.8/5.1 (10/'02), NetBSD 4.0 (06/'06).

Details which are found in early and in some later ash variants:

2.) Traditional BSDs ('91-'95)

  4.3BSD-Net/2 (06/'91) - sh(1)

  4.4BSD-Alpha (06/'92) - starts aiming at POSIX.2 - sh(1)

  4.4BSD (06/'93) - sh(1)

   Apparently, the 386BSD patchkit 2.4 (local copy) went into this release or vice versa:


  4.4BSD-Lite (06/'94) - sh(1)

  4.4BSD-Lite2 (06/'95) - sh(1)

This release has synched with NetBSD at about 05/'95.

3.) 386BSD ('92-'93) - sh(1)

The 386BSD distribution was derived from 4.3BSD-Net/2 and aimed at maintaining a runnable system,
that is, completing Net2 with the pieces which had to be removed after the license war.

See the 386BSD archive on TUHS.

4.) (BSDi) BSD/OS ('92-'03)

This is a commercial BSD branch from the vendor BSDi.
And the vendor F5 for example uses a BSD/OS 4.1 as core for its product BIG-IP 4.2.

   Thus, there remain for example the following differences to modern variants:

5.) NetBSD ('93-current)

Initially derived from 386BSD-0.1 patchlevel 0.2.3, soon synchronized with 4.4BSD-Lite.

Some changes:

NetBSD 0.8 and 0.9 (by Jason Steven aka Neozeed).
CVS-Web on (since ~1.0).

6.) FreeBSD ('94-current)

Derived from 4.4BSD-Lite, -Lite2 and NetBSD 1.2/1.3

Some changes:

CVS-Web on

7.) Early port of a NetBSD variant to Linux ('93)

Contributions by e.g. Sunando Sen, Arjan de Vet, Florian La Roche.
This earlier port is not related to the later dash from Herbert Xu.

As this variant is closeley related to 4.3BSD-Net/2 with the 386BSD patches, it still shows the following effects:

This variant is usually known as ash-0.2 and several distributions came with it:

ash-linux-0.2 tarball on

8.) dash ('97-current)

This started as a Linux port for Debian, from Herbert Xu, derived from NetBSD.
And Debian stable release 2.0 ("Hamm", 03/'99) then replaced the early Linux port ash-0.2 with this variant.

Two high priorities of this project are restricting to POSIX conformance and slim implementation.

The Ubuntu distribution switched to dash ( as system shell (/bin/sh) with release 6.10 (october '06).
The Debian distribution switched to dash with the release 6.0/"Squeeze" (release goals, Debian shells).
(It was a release goal for Lenny already, but the move was postponed, then).

The dash manual documents the command line history and editing capabilities (gained with 4.4BSD-Alpha). These features are disabled at compile time, though.
You can enable them by recompiling: have the "BSD editline and history library" available (package libedit-dev on Debian) and remove -DSMALL from src/Makefile.

Some changes:

Herbert Xu's dash, Debian package. For the changelogs, see ./Changelog ( snapshot) and the older ./debian/changelog (snapshot) in the distribution.

9.) Slackware variant of debian ash ('06-current)

Slackware 2.1 ('10/'94) had switched to the abovementioned early ash-linux-0.2 port.

Slackware 8.1 (09/'06) then switched to a variant similar to dash 0.3.7-14.

It is based on a NetBSD ash tarball named ash-0.4.0 and a collection of 21 debian patches, (with the debian specific stuff taken out).
With later releases, these patches were not modified anymore (until Slackware 13.1, at the time of this writing).
The debian changelog which is contained stops at 0.3.7-14, a fix from 0.3.7-11 is in
(preserve previous exit status upon entering a function), and a fix from 0.3.7-15 is not in
(unknown escape codes are printed literally by echo).

Some other smaller distributions, emphasizing on a slim shell, also use the Slackware shell variant.

Via mirrors to slackware-current/source/ap/ash/

10.) Android variant of NetBSD ash ('05-current)

The system shell on Android (/system/bin/sh) originally is an ash variant.
The Android core consist of a Linux kernel and NetBSD utilities (not GNU for license reasons).
The initial release (android-1.0) in the public part of the Android core source repository dates from Oct 21 2007.
It's a checkout from the NetBSD repository from the time around where NetBSD was tagged 3.0, which in turn was released December 2005.
This suggests that the NetBSD utilities were checked out once, early in the alpha phase of the Android project.
The source was just minimally modified so that it compiled on Android (Linux kernel, NetBSD utilities).
And from then on changes were almost only done for compiling reasons., the public part in the Android Open-Source Project (AOSP). Core source: /platform/system/core

11.) Cygwin variants of ash ('98-current) (aka,
Repository of older Cygwin releases,
ChangeLog.RedHat from ash-20040127-3

12.) BusyBox ('01-current)

The BusyBox distribution is aiming for small implementations.
Apart from that, emphasis is both on standards compliance and on user convenience, where bash plays a role.
Although further features were added, there's no reference documentation at the time of this writing (05/'11).

Home is, source online (with log)

13.) Minix ('01-'06/'06-current)

Sven Mascheck, <>