On Thu,06.Aug.09, 23:24:18, Paul E Condon wrote:
> Recent mentions of dash on this list prompted me to try to learn more
> about it. I googled and learned that it has a different convention for
> indicating that a file is a script that should be processed by
> dash. This affects only the first line of a script.
The first line in a script *should* indicate what program is to be used
to interpret it. The most common script interpreter on a GNU/Linux
system is a "Bourne shell" (sh) *clone*. Both bash and dash are such
clones. The downside to bash (the "Bourne again shell") is that it has
a *lot* of extensions, and even worse, it's using them even if called as
'sh' (yes, it can tell if it was invoked as 'sh' or 'bash').
Dash ("Debian Almquist SHell") also has two or three extensions, but
these are specifically allowed by Debian Policy, it is about 10 times
smaller than bash and significantly faster.
Of course, you probably won't notice the speed difference on a three
line script.
> Is this the only difference in coding scripts? I know it is said to be
> smaller and faster, which is good, but are there things that need to
> be changed in a bash script, after the first line, in order to make it
> into a proper dash script? What are they? Where can I learn what to
> change in my scripts? Or is it just smaller and faster with no
> conversion pain?
If your scripts do not use bash extensions (bashisms) and the shebang is
#!/bin/sh
then just install dash, let it take over the /bin/sh symlink (run
'dpkg-reconfigure dash' if you're on lenny) and enjoy the additional
speed. I've been doing this for years without ill effects. You will also
notice if any 'sh' scripts are using bash extensions ;)
A safer way to do this is to use the 'checkbashisms' script in the
package 'devscripts' first. Beware though that 'checkbashisms' is not
100% sure. In the end you won't know unless you check the scripts
yourself (if you know what to look for) or just try to run them with
dash:
/bin/dash my_custom_script.sh
If you do find a script that doesn't work with dash (but does with bash)
you can:
1. try to rewrite it in 'sh'
2. change the shebang to point to 'bash'
Option 1. is good if you want to make your scripts more portable.
Option 2. is easier, especially on complex scripts.
BTW, this talk about 'dash' vs. 'bash' is NOT about the user shell (the
shell that is specified in /etc/passwd and started on login to the
console or when you open a terminal emulator). As a user shell dash is
NOT apropiate, unless you are running some embedded system with very
little storage/memory.
Regards,
Andrei
--
If you can't explain it simply, you don't understand it well enough.
(Albert Einstein)
Attachment:
signature.asc
Description: Digital signature