如何在Makefile中正确转义&>重定向符号?
问题原因
Makefile默认调用/bin/sh执行所有规则下的命令,而&>是Bash独有的重定向语法,不符合POSIX shell标准。
在sh的解析逻辑里,python notation.py &> notation.log会被拆成两部分:
python notation.py &:把python进程放到后台执行,make不会等待该进程运行结束> notation.log:单独创建空的notation.log文件
最终就会出现日志文件大小为0、输出没有被捕获的现象。
正确写法
优先选择第一种兼容性最好的方案:
- 方案1:使用POSIX标准重定向语法(通用无依赖)
不需要修改Makefile的shell配置,直接把bash专属的&>替换成标准的输出+错误重定向写法即可:
逻辑是先把标准输出重定向到notation.log,再把标准错误流(文件描述符2)指向标准输出流(文件描述符1)对应的位置,实现所有输出都写入日志的效果,在所有类UNIX系统的默认shell下都能正常运行。run: python notation.py > notation.log 2>&1 - 方案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
相关产品推荐
相关产品推荐

