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

如何在Makefile中正确转义&>重定向符号?

问题原因

Makefile默认调用/bin/sh执行所有规则下的命令,而&>是Bash独有的重定向语法,不符合POSIX shell标准。
在sh的解析逻辑里,python notation.py &> notation.log会被拆成两部分:

  1. python notation.py &:把python进程放到后台执行,make不会等待该进程运行结束
  2. > notation.log:单独创建空的notation.log文件
    最终就会出现日志文件大小为0、输出没有被捕获的现象。
正确写法

优先选择第一种兼容性最好的方案:

  • 方案1:使用POSIX标准重定向语法(通用无依赖)
    不需要修改Makefile的shell配置,直接把bash专属的&>替换成标准的输出+错误重定向写法即可:
    run:
        python notation.py > notation.log 2>&1
    
    逻辑是先把标准输出重定向到notation.log,再把标准错误流(文件描述符2)指向标准输出流(文件描述符1)对应的位置,实现所有输出都写入日志的效果,在所有类UNIX系统的默认shell下都能正常运行。
  • 方案2:指定Makefile使用Bash执行命令
    如果习惯用&>的简写,可以在Makefile头部显式声明执行命令用的shell为bash,让&>语法能被正确解析:
    SHELL := /bin/bash
    run:
        python notation.py &> notation.log
    
    注意这个方案依赖系统存在/bin/bash路径,在默认没有预装bash的精简系统(比如部分嵌入式系统、Alpine Linux)上会执行失败。

如果需要同时在终端打印输出、又把输出写入日志,可以搭配tee命令使用,标准写法如下:

run:
    python notation.py 2>&1 | tee notation.log

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:06:27