如何在Makefile中隐藏执行命令仅显示输出,或对rsync命令进行样式化?
如何在Makefile中隐藏执行命令仅显示输出,或对rsync命令进行样式化?
我来帮你解决这个问题!针对你的需求,有两种常见的处理方式,既可以完全隐藏rsync命令只显示输出,也可以给命令加上样式,而且都能兼容Ubuntu 20.04和最新的MacOS:
方案一:完全隐藏rsync命令,仅显示输出结果
Makefile默认会打印每条执行的命令,要隐藏命令本身,只需要给rsync行加上@前缀(就像你给echo命令加的那样)。这样Make就不会输出rsync的命令语句,只会展示rsync运行后的输出内容,同时保留你已经设置的灰色样式:
deploy: @echo "🚀 Starting deployment." @rsync -azP --delete --exclude-from=.deployignore --checksum --no-perms -e "ssh -p $(SSH_PORT)" $(LOCAL_PATH) $(SSH_USER)@$(SSH_HOST):$(REMOTE_PATH) | awk '{print "${GRAY}> " $$0 "${NC}"}' @echo "✅ All modified files have been deployed."
解释:@前缀会抑制Make默认的命令打印行为,rsync的输出会通过awk处理,给每一行加上灰色的>前缀,保持你想要的视觉效果。
方案二:样式化显示rsync命令,再展示输出结果
如果你不想完全隐藏命令,而是想让用户看到执行的rsync命令但给它加上样式,可以先通过echo打印带颜色的命令,再用@执行rsync避免重复输出默认命令:
deploy: @echo "🚀 Starting deployment." @echo "${GRAY}执行命令: rsync -azP --delete --exclude-from=.deployignore --checksum --no-perms -e \"ssh -p $(SSH_PORT)\" $(LOCAL_PATH) $(SSH_USER)@$(SSH_HOST):$(REMOTE_PATH)${NC}" @rsync -azP --delete --exclude-from=.deployignore --checksum --no-perms -e "ssh -p $(SSH_PORT)" $(LOCAL_PATH) $(SSH_USER)@$(SSH_HOST):$(REMOTE_PATH) | awk '{print "${GRAY}> " $$0 "${NC}"}' @echo "✅ All modified files have been deployed."
解释:
- 先通过echo打印灰色的rsync命令(注意转义双引号
\",避免Make解析出错) - 用
@执行rsync,避免Make重复输出未加样式的命令行 - rsync的输出依然通过awk处理,保持统一的灰色前缀样式
兼容性说明
你定义的ANSI颜色变量GRAY和NC在Ubuntu(GNU环境)和MacOS(BSD环境)下都能正常工作,awk的语法也兼容两者——你已经正确使用了$$0(Make需要转义$为$$,才能让awk识别为$0),所以不用担心跨平台问题。
备注:内容来源于stack exchange,提问作者Richard B
相关产品推荐
相关产品推荐

