最近在编译平台SDK时,使用环境是ubuntu16.04,开始通过执行shell脚本配置SDK的编译环境,整个过程刚开始就夭折了,原因是ubuntu的默认shell使用的是dash,而SDK的shell脚本是基于bash而写,自然刚开始执行就失败。
首先,可能会想到把shell脚本中默认指定的shell修改为bash,通常在shell脚本开头都会有如下这样一句指明shell:
#!/bin/sh
这里的sh是一个链接,它实际指向,在ubuntu下默认是指向dash。
通过下面的方法可以修改sh的默认指向,比如通过下面的操作步骤,可以修改sh指向bash:
sudo dpkg-reconfigure dash
执行上述命令后,会弹出一个提示,选择”NO”即可。
上面的方法看起来是没什么问题,那下面说下ubuntu为什么不直接默认指定bash shell呢,原因是dash比bash的效率要高,轻量级,作为一个操作系统,自然效率越高越好。但是一般linux系统还是习惯用bash的比较多,所以大部分shell脚本都会基于bash语法来写,这时可能有人会想到另一种方法,即直接指定shell:
#!/bin/bash
上面这种写法固然是可行,但失去shell脚本的通用性,因为shell脚本可能会执行在不同的shell上,我们知道除了bash,dash这两种shell外,还有很多种ash,ksh等等,所以#!/bin/sh这样的写法似乎是最符合“垮平台”的理念的。
很多程序猿都习惯ubuntu,那怎么在终端控制台(ctrl+alt+t)上,直接执行#!/bin/sh这样的shell脚本呢?其实使用ctrl+alt+t打开的这个控制台,它自己使用的shell其实是bash,另外ubuntu root用户使用的也是bash,可见bash是linux世界里最常用的shell,就连ubuntu也不敢忘本。下面自然想到,让#!/bin/sh在当前shell下面执行就行了,而不用另开一个子shell执行(子shell用的是dash),所以在linux下有个特别的点号,如下:
$. ../xxx.sh
第一个点号指明在当前shell里执行,后面跟一空格,如果没有这个点号,$../xxx.sh将会另开一个子shell执行脚本,那样就使用ubuntu默认的dash去执行 。
ubuntu下字符终端ctrl+alt+F1-6,有6个字符终端,另外F7是我们通常见到的图形界面。它们所用的shell没有什么区别。
原文链接:https://www.f2er.com/bash/392150.html