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

From ArchWiki
Jump to: navigation, search
(Initscript status: seems to happen with init only)
(use https for links to archlinux.org)
(13 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{stub}}
+
[[Category:Arch development]]
 
{{expansion}}
 
{{expansion}}
 +
{{accuracy}}
  
This article is for those who want to help [[dash]] become the new {{filename|/bin/sh}}.
+
[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 increase 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:
 
From http://article.gmane.org/gmane.linux.arch.devel/11418:
*http://mailman.archlinux.org/pipermail/arch-dev-public/2007-November/003053.html
+
*https://mailman.archlinux.org/pipermail/arch-dev-public/2007-November/003053.html
 
*https://launchpad.net/ubuntu/+spec/dash-as-bin-sh
 
*https://launchpad.net/ubuntu/+spec/dash-as-bin-sh
 
*https://wiki.ubuntu.com/DashAsBinSh
 
*https://wiki.ubuntu.com/DashAsBinSh
Line 13: Line 18:
 
==Identifying bashisms==
 
==Identifying bashisms==
  
Install {{package AUR|checkbashisms}} with an [[AUR helper]].
+
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===
 
===Common places to check===
  
*Installed scripts with a {{codeline|#!/bin/sh}} shebang:
+
*Installed scripts with a {{Ic|#!/bin/sh}} shebang:
 
  $ find {,/usr}/bin -type f \
 
  $ find {,/usr}/bin -type f \
     -exec grep -l -- '^#!/bin/sh' {} \; \
+
     -exec grep -q -- '^#!/bin/sh' {} \; \
 
     -exec checkbashisms -f -p {} +
 
     -exec checkbashisms -f -p {} +
  
Line 30: Line 37:
 
*Initscripts and daemons:
 
*Initscripts and daemons:
 
  $ find \
 
  $ find \
     /etc/rc.{conf,d,local{,.shutdown},multi,shutdown,single,sysinit} -type -f \
+
     /etc/rc.{conf,d,local{,.shutdown},multi,shutdown,single,sysinit} -type f \
 
     -exec checkbashisms -f -p {} + 2>&1 |\
 
     -exec checkbashisms -f -p {} + 2>&1 |\
 
     grep -v -e '^you may get strange results' \
 
     grep -v -e '^you may get strange results' \
 
             -e 'does not appear to have a #! interpreter line;$'
 
             -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 (as root):
 +
 +
  ln -sfT /bin/dash /bin/sh
  
 
==Initscript status==
 
==Initscript status==
  
* The FD checks with {{codeline|test -t}} in {{filename|/etc/rc.d/functions}} do not work correctly with dash, breaking colored output as a result. See http://bugs.archlinux.org/task/19551?project=1&order=id&sort=desc (the patch does not address this issue in particular).
+
* The FD checks with {{Ic|test -t}} in {{ic|/etc/rc.d/functions}} do not work correctly with dash, breaking colored output as a result. See https://bugs.archlinux.org/task/19551?project=1&order=id&sort=desc (the patch does not address this issue in particular).
:* Try using {{codeline|test(1)}} instead of the dash builtin?
+
:* Try using {{Ic|test(1)}} instead of the dash builtin?
:* Is the problem specific to calls involving {{codeline|init(1)}}?
+
:* Is the problem specific to calls involving {{Ic|init(1)}}?

Revision as of 23:51, 5 December 2012

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: please use the first argument of the template to provide a brief explanation. (Discuss in Talk:Dash as /bin/sh#)

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: please use the first argument of the template to provide a brief explanation. (Discuss in Talk:Dash as /bin/sh#)

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 /bin/sh at the first line of the script, which means it will run /bin/sh as the shell, which by default in Arch is a symlink to /bin/bash.

You can re-symlink /bin/sh to /bin/dash, which can increase 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 /bin/sh.

From http://article.gmane.org/gmane.linux.arch.devel/11418:

Identifying bashisms

Features of bash that aren't included in Dash ('bashisms') will not work without being explicitly pointed to /bin/bash. The following instructions will allow you to find any scripts that may need modification.

Install checkbashismsAUR from the AUR.

Common places to check

  • Installed scripts with a #!/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 /bin/sh. To do so use the following command (as root):

 ln -sfT /bin/dash /bin/sh

Initscript status

  • Try using test(1) instead of the dash builtin?
  • Is the problem specific to calls involving init(1)?