Re: question about Dash
- From: "Boyd Stephen Smith Jr." <bss@xxxxxxxxxxxxxxxxx>
- Date: Fri, 7 Aug 2009 11:28:16 -0500
In <20090807072350.GA17035@xxxxxxxxxxxx>, Alex Samad wrote:
On Thu, Aug 06, 2009 at 11:24:18PM -0600, Paul E Condon wrote:
Recent mentions of dash on this list prompted me to try to learn more
I feel uncomfortable being so totally ignorant about an impending change
in Debian. I want to read something, but can't find anything to read.
from my understanding
dash is a posix compliant shell
bash isn't - well it has whats called bash-isms
Both are POSIX compliant as far as I can tell.
all scripts that work in
sh should work in dash and bash
dash should work in bash
This means that if you write a script using only POSIX features it will work
on both shells.
not all bash scripts will work in sh or dash
However, there are many, many bashisms (some of which are also kshisms) that
work in bash but are NOT POSIX features. Dash does not implement all of the
bashisms (or kshisms), so it cannot run scripts using them.
For many years, /bin/sh was bash on Debian. Because of this many users,
maintainers, and developers got used to using bashisms even in scripts that
were executed by /bin/sh. (Bash does turn off some features when invoked as
/bin/sh, but not many.)
Even users, maintainers, and developers that came from other OSes were used
to some of these features. The Korn Shell--ksh--has been the default user
shell on many UNIXes, and sometimes was even used as /bin/sh.
As such, the vast majority of shell scripts are NOT POSIX compliant, so even
with a POSIX shell as /bin/sh many scripts break.
the first line is used to invoke a program to process the script for
there is name for this, but I can't remember it right now.
The "#!" is colloquially referred to as a shebang. In all known
implementations of POSIX, "#!" as the first two characters in a shell script
indicates that the rest of the line is used as the command interpreter.
Implementations vary in how they do path lookup on this and how whitespace
is handled and if/when the line is truncated.
Bashism - off the top of my head, I believe things like $(( - arithmetic
three=$((1 + 2))
nine=$((three * 3))
twelve=$((38 / $three))
is a valid SUSv2 shell script. Not sure about ISO POSIX.
"local" is a bashism. ("local" is also a "dashism"; Debian policy requires
/bin/sh to support lexically scoped environment variables.)
Array variables are a kshism inherited by bash
"<<<" is a bashism
print is a kshism inherited by bash
There are many others. The Open Group publishes the Single Unix
Specification (SUS), available free-of-charge from their website after a
single registration form. As holders of the UNIX trademark, they determine
what is and what isn't "UNIX". Part of being "UNIX" is conformance to the
Single Unix Specification, which started as (and still is) POSIX plus
extensions. That document will tell you exactly what features you can
expect from a UNIX shell (usually /bin/sh) -- anything not listed should
normally be avoided (or you should specify what shell you want).
Boyd Stephen Smith Jr. ,= ,-_-. =.
bss@xxxxxxxxxxxxxxxxx ((_/)o o(\_))
ICQ: 514984 YM/AIM: DaTwinkDaddy `-'(. .)`-'
 Unless you run the Linux distribution "#!" which they pronounce as
 Oddly enough, using a #! line makes any shell script have "undefined"
behavior and thus be--strictly speaking--POSIX non-compliant. All known
implementations of the POSIX standard use the #! line similarly, so
#!/bin/sh works on all of them.
Description: This is a digitally signed message part.
- Prev by Date: Re: question about Dash
- Next by Date: Utility to decompress .ape files.
- Previous by thread: Re: question about Dash
- Next by thread: Re: question about Dash