前几天在Virtualbox+Ubuntu环境下搞定了ISE的安装,紧接着,就可以把petalinux拷贝到ubuntu底下,继续做XUP的petalinux的几个实验。
做到实验1.3,出问题了。
当我准备建立一个最简单的mytest交叉编译工程的时候,按照实验指导书上的写法,只需要这样就可以了:
petalinux-new-app mytest
这是一个脚本,把交叉编译所需要的Makefile以及工具链的路径什么的帮你设好,这样,你就可以直接make可。
当我兴致博博地运行这个脚本的时候,却被当头一棒
24: function: not found
仔细看petalinux-new-app 的第24行,没什么问题啊,百思不得其解。 第24行是这样滴:
function usage {
第一行是这样滴:
#!/bin/sh
不过,这两行代码对我来讲,都有些怪怪的感觉。 因为,我一般喜欢直接写明到底是bash还是其他的,用sh这种东东总感觉隔了一层。 另外,在bash里面写函数,固然写funtion xxx {也没错,但一般写成这样
function (){
因此,怀疑/bin/sh中有问题, 果然,ls /bin/sh -al 以后,发现sh指向的不是bash,而是dash.
dash据说更快,但是功能没有bash全,ubuntu为了提高启动速度,从6.10开始,就把缺省的shell改成了dash, 但带来了广大程序员的痛骂,因为,dash的功能也弱一些,不少非posix的语法并不支持。
最暴力的方法当然是直接把/bin/sh的软链接改到bash中, 但是,有优雅一些的方法,
sudo dpkg-reconfigure dash
出现菜单问你是否要dash的时候,选no就可以了。
再次检查一下, ls /bin/sh -al 发现软链接指向/bin/bash就可以了。
讨论:
1. 当然,还有一个办法就是直接把脚本的第一行改为
#/bin/bash
就可以了。 但是,牵扯到的脚本好几十个,改起来还有点麻烦的。
2. 既然function xxxx {} 这种语法并不符合posix要求, 那最好都改成 xxx() {}这种声明方法,以便有更多的兼容性。 这种改动工作量更大些