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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:24:06