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 .. 2021-02-13 (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 closer 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.
And for the variants without changelogs (the traditional BSDs, 386BSD, BSD/OS and Minix)
this page aims at being a complete log concerning source code changes.
But for the other, later variants this was certainly not the goal and just a few,
arbitrarily chosen changes or bugfixes are listed.
Why no commented diffs? I won't manage to do that work. And if you're interested
on this level, then you are looking at the source already and these comments are a good start.
Content:
· 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.
First, a few summaries for orientation, what it's about with these almquist shells.
Differences between the ash family and the SVR4 shell:
- ash implements "
$(...)
" command substitution
- accepts "
export VAR=value
"
-
echo
accepts option -e to interpret escape sequences (undocumented)
- the file DIFFERENCES from the original distribution
lists most remaining differences to both the Berkeley shell
(a variant of the V7 shell) and the SVR4 shell.
A few differences are documented but not listed in this file, e.g.,
the built-ins "bltin
" and "setvar
"
- only mentioned in the manual, but not explained:
built-ins
"catf"
, "expr"
, "line"
, "nlecho"
- a characteristic feature of almquist shells in general:
a PATH component flagged with a trailing "%func
" is recognized
as a directory containing function definitions.
Read more about this.
- another characteristic feature of almquist shells:
"local -"
makes $-
local in functions (thanks to Jilles Tjoelker)
- implements "
--
" as end of options for built-ins
- "naturally", nothing from the list of
specific Bourne shell behaviour is implemented.
Common to ash variants and the SVR4 shell only, in contrast to other bourne compatible shells:
- "
notexistent_cmd 2>/dev/null
" doesn't redirect the error "not found"
(exception: dash since 0.4.17 and FreeBSD 9.0)
- "
echo x > file*
" doesn't expand file*
Details which are only found in early ash variants:
- (only) the original release knew an undocumented version variable:
SHELLVERS="ash 0.2"
Later variants can only be recognized and distinguished by characteristic features.
(A release "ash-0.2" of the later linux port is not related to this variable.)
- like SVR4 sh: no command line editing and history (by intention)
- like SVR4 sh: no
#
and %
form of parameter expansion
- like SVR4 sh: no arithmetic expansion
- like SVR4 sh: no multi-digit parameter expansion like
${10}
- like SVR4 sh: "
set --
" doesn't unset the parameter list
- like SVR4 sh: traditional behaviour about
IFS vs. "$*"
- by intention, there is no backslash escaping in the back-tick form of
command substitution (
`...`
), side effect: this form cannot be nested [changed in 4.4BSD]
- undocumented: no "type" built-in (probably accidentally) [fixed in NetBSD1.3,FreeBSD2.3]
- read by default behaves as if the POSIX flag -r is active
- PS1 is "
@
"
- with "
sh -c cmd arg0 arg1
", $1
is set to arg0
[fixed relatively late: all traditional BSDs, and early Free-/NetBSDs and early Minix
behave as well]
- bug: "
VAR=set eval 'echo $VAR'
" gives no output,
that is, you can't call eval
with local variables
- "
for i do
" not accepted
(but "for i; do
" or "for i<newline>do
")
- flag
-v
not implemented
- reads SHINIT at start
(except if a login shell or called with "sh file")
- "
trap
" doesn't accept symbolic signal names
- "
expr
" built-in, merged with "test"
- negation of patternmatching with "
!!pattern
"
- flag
-z
(don't collapse filename pattern if it doesn't match)
- rejects "
case x in (x)
"
[1]
[Fixed soon. As exceptions, NetBSD and Minix fixed this quite late]
- bug: segmentation violation on empty command substitution "
$( )
"
(but not on "` `
")
- bug: segmentation violation on "
${var=`cmd`}
"
- compile time option (off by default) for a "cleaner" eval (not concerning the above problem, though)
- shell recognizes
#!
(if the kernel fails), if not compiled with BSD support
This compile time macro is explained with "running 4.2 BSD or later".
This code still exists in some modern variants, but is de-facto inactive.
[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:
- bug: built-ins in command substitution are wrongly optimized,
the shell exits upon
foo=`exit 1`
[fixed in NetBSD 1.4, dash-0.3.5 and thus busybox, FreeBSD 9.0]
A detail which is found in ash, in the SVR4 shell,
and in most bourne compatible shells, but usually not documented
- accepts "
{ ...; }
" as body in a for
loop (instead of "do ...; done
")
2.) Traditional BSDs ('91-'95)
4.3BSD-Net/2 (06/'91) - sh(1)
- PS1 depends on uid (well known
#
or $
)
- in contrast to the original distribution,
echo
doesn't interpret escape sequences by default on BSDs,
but requires -e
- not only "--", but also "-" terminates options
- shell version variable
SHELLVERS="ash 0.2"
removed
- undocumented: flag -v (originally omitted) is accepted but not implemented
- compile time option for different parsing in eval removed
- the abovementioned job control patch is applied.
- built-in "bltin" renamed to "command" (not documented until the next release)
- built-ins "catf", "expr", "line", "nlecho" removed
- "chdir" becomes synonym for "cd"
- A user without HOME starts in /tmp instead of / (except uid 0).
4.4BSD-Alpha (06/'92) - starts aiming at POSIX.2 - sh(1)
- history and line editing added
(fc, $FCEDIT, $HISTSIZE, flags -E and -V)
and atty support removed (optional support by terminal driver)
- arithmetic expansion "
$((...))
"
- ...and undocumented built-ins
"let"
and "exp"
- built-in "printf"
- negation of pipeline with !
- tilde expansion added, /u/logname mechanism removed
- aliases
- "set -o" prints options
- "cd -" added
- read
ENV
instead of SHINIT
at start
- renamed flag -j (jobcontrol) to -m (like SVR4 shell),
added flags -C (noclobber), -a (allexport), -b (notify asynchronous jobs),
implemented and documented flag -v (formerly accepted but not implemented),
removed flag -z, (don't collapse filename pattern if it doesn't match)
accepted (document as not implemented) flag -u (error on unset)
- documents multi-digit parameter substitution, like
${10}
, but doesn't implement it
- warning "You have stopped jobs."
- "
shift
" built-in knows "can't shift that many"
- warning "running as root with dot in PATH" in case
- negation of patternmatching with "
!!pattern
" removed
- bugfix: accepts empty command substitution "
$( )
"
- "
lc
" built-in removed
- manual page completely rewritten
- ... and the
%func/%builtin
functionality was removed from the manual but not from the code
- ... and note that the
#
and %
forms of
parameter expansion are documented as unimplemented
4.4BSD (06/'93) - sh(1)
Apparently, the
386BSD patchkit 2.4
(local copy) went into this release or vice versa:
- escaping in back-tick command substitution (
`...`
) "re-introduced",
thus back-ticks become nestable
- accepts "for i do"
- backquoted commands set $?
- do not redirect STDIN of background commands to /dev/null
if it has been redirected previously
- bugfix about escaping in quoted variables and case switch
- redirections may precede non-simple commands
and:
- "wait" yields an exit status
- "fc" knows "missing history argument"
- extended copyright message and sccsid in all files
4.4BSD-Lite (06/'94) - sh(1)
- "read" errors with "arg count" if called without arguments.
The code was already there but a bug caused a SEGV only.
- bugfix in conditional parameter expansion, e.g. "
${var=`cmd`}
" is accepted
4.4BSD-Lite2 (06/'95) - sh(1)
This release has synched with NetBSD at about 05/'95.
- parameter expansion knows # and %
- "ulimit" built-in added
- "printf" built-in removed
- arithmetic expansion accepts binary logic operators (&, |, ^, ~)
- "umask" understands symbolic notation
- PATH assigment preceding a command is even regarded for the lookup
- source command does path lookup for executable files
- fix about saved exit status
(examples: "
false; echo `echo $?`
" or "false || foo=bar; echo $?
" or "foo=; false; $foo; echo $?
")
- leading colon in default PATH removed (influences restricted mode)
- doesn't warn root anymore if PATH contains a dot
- Only look up ENV at startup if IDs equal effective IDs
- "false" built-in added ("true" already was handled equal to ":")
- dash can be escaped in range, like [a\-z]
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.
- 386BSD 0.0: initial release, sh is identical to 4.3BSD-Net/2 (02/'92)
- 386BSD 0.1: "cd" doesn't print target directory (CDPATH, symlinks)
- patchkit 0.2.3 (04/'93): fix for "cd" (when internally calling pwd(1))
- patchkit 0.2.4 (06/'93) (local copy)
- escaping in back-ticks fixed, thus back-ticks become nestable
- accepts "for i do"
- backquoted commands set $?
- do not redirect STDIN of background commands to /dev/null
if it has been redirected previously
- bugfix about escaping in quoted variables and case switch
- redirections may precede non-simple commands
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.
- initial release taken 01/'92 from 4.3BSD-Net/2.
With some tiny changes this becomes BSD/OS 1.0 (03/'93).
- BSD/OS 1.1 (01/'94)
- resynchronized with 4.4BSD, and
- csh-like "limit/unlimit" added
- restricted functionality added
- "case" improved (POSIX: don't recognize keywords in patterns)
- bug in redirection fixed
- bugfix for "set -a"
- noninteractive shell handles SIGINT not until cmd terminated
- BSD/OS 2.0 (02/'95)
- resynchronized with 4.4BSD-Lite, and earlier BSD/OS-specific changes re-added
- Get IFS delimiters using POSIX.2 rules
- POSIX made ":" a special built-in, now it behaves different from "true" on errors
- fix about return value of "unset" under special conditions
- fix restricted mode: apart from /cmd also deny ./cmd
- fix internal types (now unsigned) in resource consumption output
- BSD/OS 2.1 (03/'95)
- tiny fix for "fc" history built-in (NULL argument)
- BSD/OS 3.0 (06/'96)
- resynchronized with 4.4BSD-Lite2, and earlier BSD/OS-specific changes re-added,
- ...thus the "printf" built-in disappears again
- (exception: main.c is 8.7 7/19/'95" instead of "8.6 5/28/'95" in 44BSD-Lite2)
- redirection "<>" added
- accepts "case x in (x)"
- fix about matching a backslash-escaped dot
- some fixes about dereferencing null pointers
- bugfixes with "showtree" output (compile time debug option)
- BSD/OS 4.0 (02/'98) - and BIG-IP 4.2 (BSD/OS 4.1 derived, vendor is F5)
- "test" built-in added (link to system source)
- fixes for "getopts" (OPTIND variable, error prints script name instead of "getopts")
- fix for exit status of "return" (built-ins)
- fixes in redirection code (closing file descriptors)
- a fix for restricted mode
- unused #! support removed
- BSD/OS 5.0 (05/'02)
- fix for "cd" (when internally calling pwd(1))
- BSD/OS 5.1 (05/'03)
- flag -r added (to sync with POSIX); former "read" flag -e becomes default
Thus, there remain for example the following differences
to modern variants:
- no "type" built-in
- "trap" doesn't accept symbolic names
- old behaviour about
IFS vs. "$*"
5.) NetBSD ('93-current)
Initially derived from 386BSD-0.1 patchlevel 0.2.3,
soon synchronized with 4.4BSD-Lite.
Some changes:
- initially 386bsd-0.1 patchkit 0.2.3, 03/'93, NetBSD 0.8
- 386BSD patchkit 0.2.4 07/'93, NetBSD 0.9
- "false" built-in, 07/'93, NetBSD 0.9
- "umask" accepts symbolic notation, 07/'93, NetBSD 1.0
- synch with 4.4BSD-Lite, 05/'94, NetBSD 1.0
- "test" (system command, no built-in yet) is imported from pdksh-5.0, 06/94, NetBSD 1.0
- "ulimit" built-in, 11/'94, NetBSD 1.2
- # and % parameter expansion, 01/'95, NetBSD 1.2
- with "sh -c cmd arg0 arg1", $1 is set to arg1, 10/'96, NetBSD 1.2
- wrongly accepts multi-digit parameter expansion without braces, like
$10
,
01/'97, NetBSD 1.3
- "type" built-in added, 02/'97, NetBSD 1.3
- modern behaviour about IFS vs. "$*",
07/'97 for NetBSD 1.3
- "read -r", 11/'97, NetBSD 1.3 (formerly it behaved so by default)
- "
<>
" redirection, 02/'99
- "test" becomes built-in (link system command source), 04/'00, NetBSD 1.5
- "trap" accepts symbolic names (and more fixes), 03/'01, NetBSD 1.6
- "set -u" actually implemented, 03/'02, NetBSD 1.6
- "printf" built-in added, 11/'02, NetBSD 2.0
- arithmetic expansion accepts variable names without dollar, 03/'05, NetBSD 3.1/4.0
- accept "
case x in (x)
" [1] see footnote above, 06/'06, NetBSD 4
NetBSD 0.8
and 0.9
(by Jason Steven aka Neozeed).
CVS-Web
on netbsd.org (since ~1.0).
6.) FreeBSD ('94-current)
Derived from 4.4BSD-Lite,
-Lite2
and NetBSD 1.2/1.3
Some changes:
- initial import from 4.4BSD-Lite 05/'94
- with "sh -c cmd arg0 arg1", $1 is set to arg1, 10/'95, FreeBSD 2.1
- merge in sources from 4.4BSD-Lite2, 05/'96+10/'96, for FreeBSD 2.2
- merge in NetBSD (~1.2) sources, 12/'96, for FreeBSD 2.2
- "trap" accepts symbolic names, 12/'96, FreeBSD 2.2
- "type" built-in added (from NetBSD), 04/'97, FreeBSD 2.2.5
- [^...] negation, 6/'97, FreeBSD 2.2.5
- import expand.c from NetBSD ~1.3, 04/'97, ~FreeBSD 3
- modern behaviour about
IFS vs. "$*", 09/'98, FreeBSD 3.1
- "test" (system command, no built-in yet) is imported from pdksh, 08/99, FreeBSD 3.3
- "read -r", 09/'99, FreeBSD 3.3 (formerly it behaved so by default)
- "VAR=set eval 'echo $VAR'" prints "set" instead of nothing, 05/'00, FreeBSD 4.6/5.0
- "
<>
" redirection, 10/'00,03/'01, FreeBSD 4.6
- "test" becomes built-in (link system command source), 11/'01, FreeBSD 4.9/5.0
- "set -u" actually implemented (see NetBSD), 03/'02, FreeBSD 4.7
- accept "
case x in (x)
" [1] see footnote above, 08-09/'02, FreeBSD 4.8/5.1
- arithmetic expansion accepts variable names without dollar, 08/'03, 5.2
- special handling for
%builtin
in PATH
was removed (%func
remains), 9.0
- "
notexistent_cmd 2>/dev/null
" now also redirects the error "not found", 9.0
- the shell doesn't exit anymore upon
foo=`exit 1`
, 9.0
CVS-Web
on freebsd.org.
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.
- v0.0 08/93: imported NetBSD sh variant 19930810
(~NetBSD 1.0, that is, close to 386BSD, and thus even close to 4.3BSD-Net/2)
- v0.1 08/93: test built-in, set -u, executable permission problem fixed
- v0.2 09/93: 19930918 NetBSD sources re-imported and re-patched
(still close to 386BSD)
As this variant is closeley related to 4.3BSD-Net/2 with the 386BSD patches,
it still shows the following effects:
- parameter expansion doesn't know
#
and %
- no
type
built-in
-
trap
doesn't accept symbolic signal names
- with "
sh -c cmd arg0 arg1
", $1
is set to arg0
- flag
-v
without functionality
- rejects "
case x in (x)
" [1] see footnote above
- bug: segmentation violation on "
${var=`cmd`}
"
This variant is usually known as ash-0.2 and several distributions came with it:
- Slackware 2.1 ('10/'94) switched from bash-1.x to this variant.
Release 7.0 added a tiny patch to fix compiling problems.
Via slackware.org mirrors to
slackware-3.3/source/ap/ash/
- Debian came with this variant until the stable release 1.3.1 ("Bo")
- The T2 SDE project uses this shell.
- Early Cygwin releases, like Beta 19.1,
incorporated it from Debian, as /bin/sh
ash-linux-0.2 tarball on metalab.unc.edu.
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
(wiki.ubuntu.com)
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:
- fork from NetBSD-current-19970715 (~ release 1.3).
It starts as "ash" release with release number "0.3-1"
It gets re-synced with NetBSD later several times.
- Sync with NetBSD on 19970715, 19980209.
- [Debian stable release 2.0 ("Hamm") 03/'99 with 0.3.4-2]
- [Debian stable release 2.1 ("Slink") 08/'99 with 0.3.4-6]
- accept "
case x in (x)
" [1] see footnote above, 08/'99, 0.3.5-4
-
<>
redirection, '99/'00, 0.3.x
- [Debian stable release 2.2 ("Potato") 08/'00 with 0.3.5-11]
- substituted the embedded
pmatch()
with fnmatch(3)
as of 0.3.7-1,
but switched this several times later (due to problems with buggy glibc versions).
This also determines if negation with [^...]
and extended character classes
like [:print:]
are recognized
- previous exit status preserved when entering a function, 12/'00, 0.3.7-11
- unknown escape sequences are printed literally by echo, 03/'01, 0.3.7-15
- "printf" built-in added, 04/'01, 0.3.8-1
- doesn't recognize "{ ... }" any longer as body in a
for
loop
(that is, as "do ... done
"), 04/'01, 0.3.8-1
- Sync with NetBSD on 20000326, 20000729, 20010316 and patches from NetBSD on 20010502, 20011103, 20020302.
- "
fnmatch
" used again (and thus [^...]
) 11/'01 with 0.3.80-30
- "
jobid
" built-in removed, 02/'02 with 0.3.8-36
- [Debian stable release 3.0 ("Woody") 07/'02 with 0.3.8-37]
- renamed to "dash" (influenced by Debian), 09/'02, with release 0.4.1.
- [Debian stable release 3.1 ("Sarge") 06/'05 with 0.5.2-5]
- Sync with NetBSD 1.6 on 20021019.
- "
notexistent_cmd 2>/dev/null
" redirects the error "not found" since 12/'02, 0.4.7.
- Sync with NetBSD on 20030123.
- "
setvar
" built-in removed 04/'03 with 0.4.14.
- "
fnmatch
" not used anymore (and thus no [^...]
) 04/'04 with 0.4.26
- As of 0.4.26-1 (2004-05-28) it's not a native debian package anymore
but is maintained independently (and debian maintenance goes to Gerrit Pape).
- added extended character classes due to still existing problems with glibc
fnmatch()
,
06/'04, 0.4.26.
- "
exp
" aka "let
" built-in removed 02/'05 with 0.5.3
- [Debian stable release 4.0 ("Etch") 04/'09 with 0.5.3-7]
- arithmetic expansion accepts variable names without dollar, 01/'09, 0.5.5.1.
- [Debian stable release 5.0 ("Lenny") 09/'09 with 0.5.4-12]
Herbert Xu's dash,
Debian package.
For the changelogs, see ./Changelog (0.5.5.1 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 slackware.org mirrors to
slackware-current/source/ap/ash/
10.) Android variant of NetBSD ash ('05-current)
Originally, the system shell on Android (/system/bin/sh) was an ash variant.
The Android core consists of a Linux kernel and, for license reasons, NetBSD utilities instead of GNU.
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, some time after 13th of june 2005
which is the latest rcs time stamp in the code.
NetBSD was going to be released as 3.0 soon, in December 2005.
The NetBSD ash source was checked out only once, early in the alpha phase of the Android project,
and was just minimally modified so that it compiled on Android.
From then on it was changed almost only for compiling reasons.
- Android alpha, mid 2005? (google-internal releases)
- Android beta, Nov 05 2007 ("birth of Android")
- Android 2.3.1_r1: command line editing and history was added, using the
"linenoise" library, Dec 2010
- Since Android 4, Oct 2011, (apparently rather some 3.x which is closed source though),
mksh is also available and has become the default shell for many apps, e.g. the terminal emulator.
android.googlesource.com, the public part in the Android Open-Source Project (AOSP).
Core source: /platform/system/core
11.) Cygwin variants of ash ('98-current)
- 1998-02-26: Cygwin Beta 19.1: ash-linux-0.2 (early linux port, see above, taken from Debian)
- 1998-03-31: Cygwin incorporates the Debian ash-0.3.2-4 (released 02/1998),
and synchs with Debian ash-0.3.4-2 on 1998-08-31.
- 1999-07-16: imports ash from FreeBSD 3.2
- 2000-05-08: "exit condition for semicolon" according to FreeBSD (2000-05-07),
and "don't run commands in backquotes in parent shell context".
- 2001-10-26:
read -r
is not default anymore, -e
not implemented anymore
- 2002-01-31: new manual page
- 2002-07-30: try
foo.exe
when foo
is found but is not an executable
- 2005-07-07: cygwin 1.5.18-1
switches
from ash-20040127 to bash-3 as
/bin/sh
- 2009-07-09: cygwin 1.7 incorporates dash-0.5.5.1, as base package
- 2009-07-14: cygwin 1.7 replaces ash-20040127-4 with dash-0.5.5.1-2
- 2009-12-01: cygwin 1.5.25-15 incorporates dash-0.5.5.1 (and keeps ash-20040127-*)
http://cygwin.com/ (aka http://sources.redhat.com/cygwin/),
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).
VMWare ESX (6.7.0) has it as system shell.
- The debian ash variant 0.3.8-5
was incorparated with busybox release 0.52 (07/'01).
(This release also added msh, the minix shell, and lush, "a work in progress").
The code was accumulated into one file and notably modified.
- compile time options
to activate math, to deactivate jobcontrol and aliases,
to activate these built-ins:
type
(early releases), getopts
,
command
, chdir
, some flags for read
(later releases);
and to integrate these commands as built-ins:
true+false
(early releases),
echo
, test
(later releases)
- ash became the default shell with busybox release 0.60.3 (04/'02).
- compile time option ("
ASH_BASH_COMPAT
", active per default)
for several bash compatibility features:
option pipefail
, substring and replacement parameter expansion
${x:y:z}
and ${x/y/z}
,
[[
, source
, $'...'
, &>
- undocumented: calls
fnmatch(3)
instead of the embedded pmatch()
,
which has further issues due to bugs in some glibc versions.
This also introduces [^...]
as synonym for [!...]
.
Home is www.busybox.net, source online (with log)
13.) Minix ('01-'06/'06-current)
Sven Mascheck, <http://www.in-ulm.de/~mascheck/various/ash/>