如何将带参数的命令作为单个参数传入脚本?内核构建脚本问题
Fixing Your Kernel Build Script's Command Execution Issue
我来帮你解决这个脚本的问题,你的run_build函数有几个关键错误导致带参数的命令无法正常执行,咱们一步步修正:
问题分析
- 错误的命令保存逻辑:原代码里的
cmd=$($1)是直接执行第一个参数(比如make),并把它的输出赋值给cmd,而不是保存完整的命令字符串——这完全不是你想要的效果。 - 参数传递失效:
$*会把所有参数拼接成一个无边界的字符串,当参数包含空格或特殊字符时会被错误拆分,应该用"$@"来保留每个参数的独立边界。 - 条件判断语法错误:
if ($status != 0)不符合shell的数值比较语法,shell里需要用专门的比较表达式。
修正后的完整函数
run_build() { # 保存完整的命令字符串,方便报错时查看 cmd="$*" # 正确执行带所有参数的命令 "$@" # 获取命令的退出状态码 status=$? if (( status != 0 )); then echo "$cmd failed!" exit 1 else echo "$cmd succeeded." fi }
关键修改说明
cmd="$*":把所有传入的参数拼接成一个完整的命令文本,这样报错时能清晰看到执行的完整命令。"$@":这是shell中传递参数的正确方式,它会保留每个参数的原始边界,确保make O=out -j8 zImage这类带参数的命令被完整识别。status=$?:直接获取上一条命令的退出状态码,比PIPESTATUS更适合这里(因为没有管道操作)。(( status != 0 )):用bash的算术扩展语法做数值比较,简洁且符合shell规范。
使用示例
现在你可以正常调用带参数的编译命令了:
run_build make O=out -j8 zImage
内容的提问来源于stack exchange,提问作者RebelLion
相关产品推荐
相关产品推荐

