今天在配置树莓派启动项的时候,发现无法执行/etc/rc.local中的命令,非常奇怪,后来网上搜索了下,发现原来是dash在作怪,具体怎么回事,我来细细讲述下.

概述

在正式讲述前,先普及下知识bashdash:

  • bash
bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。
  • dash
Dash Shell 是一个Unix Shell,比Bash Shell 小的多,符合POSIX标准。Debian曾经采用/bin/bash的更改/bin/dash,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过shell脚本测试存在运行问题。因为原先在bash shell 下可以运行的shell script (shell 脚本),会出现一些意想不到的问题,不是100%的兼用。
Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。

分析

我们先来看下/etc/rc.local文件

osmc@smallmuou:~$ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

sudo modprobe bcm2835-v4l2

exit 0

通过上述我们可以看出,该脚本是通过/bin/sh来执行的,我们ls /bin/sh

osmc@smallmuou:~$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 Jun  2 21:03 /bin/sh -> dash

原来他真指向dash,我们编写shell脚本一般是以bash为标准,而dash与bash存在较大差异,因此就会出现无法执行问题.

解决方法

sudo dpkg-reconfigure dash

选择NO,不使用Dash Shell。检查是否正确:ls -l /bin/sh

chmod +x /etc/rc.local