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

From ArchWiki
Jump to: navigation, search
(use https for links to archlinux.org)
(4 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Arch development (English)]]
+
[[Category:Arch development]]
 
{{expansion}}
 
{{expansion}}
 
{{accuracy}}
 
{{accuracy}}
  
[http://en.wikipedia.org/wiki/Debian_Almquist_shell Dash] is a minimalist POSIX-complient 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}}.
+
[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.  
 
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.  
Line 10: Line 10:
  
 
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 20: Line 20:
 
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.  
 
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 {{package AUR|checkbashisms}} from the [[AUR]].
+
Install {{AUR|checkbashisms}} from the [[AUR]].
  
 
===Common places to check===
 
===Common places to check===
Line 37: 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' \
Line 49: Line 49:
 
==Initscript status==
 
==Initscript status==
  
* 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 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 {{Ic|test(1)}} instead of the dash builtin?
 
:* Try using {{Ic|test(1)}} instead of the dash builtin?
 
:* Is the problem specific to calls involving {{Ic|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)?