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

Makefile设置PATH后@前缀失效,shell命令执行报错求助

解决Makefile中连续命令块的@前缀错误

问题原因

你遇到的@cd: not found错误,核心原因是**@是Make的语法,不是shell的语法**。当你用\将多行命令连接成一个连续的shell命令块时,每一行的@都会被原封不动传递给shell,而shell无法识别@作为命令前缀,因此报错。

Make中的@作用是抑制Make本身打印该命令行,而非控制shell的输出。对于用&& \连接的连续命令块,只需在整个块的第一行开头加一个@即可,后续行无需重复添加。

解决方案

移除连续shell命令块中的多余@,仅保留第一行的@,让整个命令块作为一个整体被shell执行,同时通过单个@抑制Make打印命令行。

修正后的代码示例

%-build-glibc:
    @echo "Building glibc"
    @mkdir -p $(DIR_BUILD)/glibc
    @export PATH=$(PATH):$(DIR_INSTALL)/bin && \
    cd $(DIR_BUILD)/glibc && \
    $(call cmd,$(DIR_BUILD)/glibc-$(VER_GLIBC)/configure \
      --host=$(TARGET_MACH) \
      --prefix=/usr \
      --libdir=/usr/lib \
      --with-headers=$(DIR_SYSROOT)/usr/include \
      --enable-bind-now \
      --enable-kernel=$(VER_LINUX) \
      --enable-stack-protector=strong \
      --disable-profile \
      --disable-werror \
      libc_cv_c_cleanup=yes \
      libc_cv_ctors_header=yes \
      libc_cv_forced_unwind=yes \
      libc_cv_slibdir=/lib \
      CFLAGS="-O2") && \
    $(call cmd,make -k install-headers cross_compiling=yes install_root=$(DIR_SYSROOT)) && \
    $(call cmd,make -j8) && \
    $(call cmd,make install install_root=$(DIR_SYSROOT))

额外说明

如果你的cmd宏本身包含@或负责处理输出抑制,需确认宏定义是否会和外层@冲突,但当前错误的直接诱因就是连续命令块中重复的@被传递给shell,移除这些多余@即可解决问题。

内容的提问来源于stack exchange,提问作者Daniel Nunez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:18