You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带参数的命令作为单个参数传入脚本?内核构建脚本问题

Fixing Your Kernel Build Script's Command Execution Issue

我来帮你解决这个脚本的问题,你的run_build函数有几个关键错误导致带参数的命令无法正常执行,咱们一步步修正:

问题分析

  1. 错误的命令保存逻辑:原代码里的cmd=$($1)是直接执行第一个参数(比如make),并把它的输出赋值给cmd,而不是保存完整的命令字符串——这完全不是你想要的效果。
  2. 参数传递失效:$*会把所有参数拼接成一个无边界的字符串,当参数包含空格或特殊字符时会被错误拆分,应该用"$@"来保留每个参数的独立边界。
  3. 条件判断语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:43:47