Difference between revisions of "Dash as /bin/sh"

From ArchWiki
Jump to navigation Jump to search
(Marked out of date: mentions rc.conf etc.)
(Redirect to a page with a proper name)
Line 1: Line 1:
[[Category:Arch development]]
#REDIRECT [[Dash]]
{{out of date|Mentions rc.conf etc.}}
[http://en.wikipedia.org/wiki/Debian_Almquist_shell Dash] is a minimalist POSIX-compliant shell. It can be much faster than Bash, and takes up less memory when in use. Most POSIX compliant scripts specify {{ic|/bin/sh}} at the first line of the script, which means it will run {{ic|/bin/sh}} as the shell, which by default in Arch is a symlink to {{ic|/bin/bash}}.
You can re-symlink {{ic|/bin/sh}} to {{ic|/bin/dash}}, which can improve system performance, but first you must verify that none of the scripts that aren't explicitly #!/bin/bash scripts are safely POSIX compliant and do not require any of Bash's features.
This article is for those who want to help [[dash]] become the new {{ic|/bin/sh}}.
From http://article.gmane.org/gmane.linux.arch.devel/11418:
*All install scripts must be sh-compatible (or we need a way of executing non-sh scripts, there is a bug open for that)
*Any daemon/init script is probably written for /bin/bash as our rc.conf and other initscripts files use bash arrays, so those need to be pointed correctly
==Identifying bashisms==
Features of bash that aren't included in Dash ('bashisms') will not work without being explicitly pointed to {{ic|/bin/bash}}. The following instructions will allow you to find any scripts that may need modification.
Install {{AUR|checkbashisms}} from the [[AUR]].
===Common places to check===
*Installed scripts with a {{Ic|#!/bin/sh}} shebang:
$ find {,/usr}/bin -type f \
    -exec grep -q -- '^#!/bin/sh' {} \; \
    -exec checkbashisms -f -p {} +
*Package install scripts:
$ find /var/lib/pacman/local -mindepth 2 -type f -name install \
    -exec checkbashisms -f -p {} + 2>&1 |\
    grep -v -e '^you may get strange results' \
            -e 'does not appear to have a #! interpreter line;$'
*Initscripts and daemons:
$ find \
    /etc/rc.{conf,d,local{,.shutdown},multi,shutdown,single,sysinit} -type f \
    -exec checkbashisms -f -p {} + 2>&1 |\
    grep -v -e '^you may get strange results' \
            -e 'does not appear to have a #! interpreter line;$'
==Relinking /bin/sh==
Once you have verified that it won't break any functionality, it should be safe to relink {{ic|/bin/sh}}. To do so use the following command:
# ln -sfT /bin/dash /bin/sh
Updates of Bash could overwrite {{ic|/bin/sh}}. To prevent this, add the following line to the [option] section of {{ic|/etc/pacman.conf}}:
NoExtract  = bin/sh

Latest revision as of 17:03, 24 October 2013

Redirect to: