这个错误通常表示脚本的语法与当前Shell解释器不兼容。在您的脚本中,第9行定义了一个函数:
function chown_pseudo_root()
这是一种Bash Shell中定义函数的语法,但您的脚本的首行是:
#!/bin/sh
这意味着脚本被指定使用 /bin/sh
作为Shell解释器。在某些系统(如Ubuntu)中,/bin/sh
实际上是指向 dash
Shell 的,而 dash
不支持 function
关键字定义函数。
解决方案
您可以通过以下方法解决此问题:
方法1:将脚本改为使用 Bash
如果可以使用 bash
,修改脚本的第一行为:
#!/bin/bash
这样,脚本会使用 Bash 解释器执行,能够正确识别 function
关键字。
完整脚本修改后如下:
#!/bin/bash
# 一键编译生成烧写包
TOP_PATH=$(dirname $(pwd))
SDK_PATH=$TOP_PATH/SIM8810_SDK_OCPU-2025-1-1
echo "top_path=$TOP_PATH sdk_path=$SDK_PATH"
# 先批量使用ts_fakeroot增加一下root权限
function chown_pseudo_root()
{
echo "start chown_pseudo_root" \
&& ../ts_fakeroot chown -R root:root ./rootfs_pvm \
&& ../ts_fakeroot chown -R root:root ./mocar*
}
chown_pseudo_root
然后重新运行脚本:
./build.sh
方法2:使用兼容 sh
的函数定义方式
如果必须使用 /bin/sh
,需要改用 dash
支持的函数定义方式,即不使用 function
关键字,而直接定义函数名称并加上括号 ()
。
修改脚本如下:
#!/bin/sh
# 一键编译生成烧写包
TOP_PATH=$(dirname $(pwd))
SDK_PATH=$TOP_PATH/SIM8810_SDK_OCPU-2025-1-1
echo "top_path=$TOP_PATH sdk_path=$SDK_PATH"
# 先批量使用ts_fakeroot增加一下root权限
chown_pseudo_root() {
echo "start chown_pseudo_root" \
&& ../ts_fakeroot chown -R root:root ./rootfs_pvm \
&& ../ts_fakeroot chown -R root:root ./mocar*
}
chown_pseudo_root
然后重新运行脚本:
./build.sh
方法3:直接使用 bash
执行脚本
如果不方便修改脚本内容,也可以直接告诉系统用 bash
来执行脚本,而不是 /bin/sh
:
bash ./build.sh
此方法对原始脚本兼容,但建议从长远角度出发,最好修改脚本的Shebang(即首行),明确指定使用 bash
。