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

Circle CI环境变量含*异常:被替换为应用目录文件列表

解决Circle CI中CRON_SCHEDULE环境变量被shell展开的问题

这是**bash路径扩展(globbing)**导致的,既不是Circle CI的特性,也不是Docker的问题,就是shell的默认行为:当shell遇到未被引号包裹的*时,会自动把它替换成当前目录下的所有文件名。你看到三个*被替换成三次文件列表,就是因为变量在传递过程中没被正确引用,shell触发了这个扩展。

正确处理方式

核心原则:变量值本身不需要转义,关键是在shell中引用变量时必须用双引号包裹,避免shell展开*。

1. Circle CI配置里的写法

在.circleci/config.yml中设置环境变量时,直接写原值即可,不需要转义:

jobs:
  your-job-name:
    environment:
      CRON_SCHEDULE: "0 15 13 * * *"
    steps:
      # 验证变量是否正确传递(必须用双引号包裹$CRON_SCHEDULE)
      - run: echo "$CRON_SCHEDULE"
      # 启动Go应用时,只要是直接执行二进制或go run,不需要额外处理
      - run: go run main.go

如果你的Go应用是通过shell脚本启动的,脚本里引用变量时必须加双引号:

# 错误写法(会触发shell展开)
go run main.go $CRON_SCHEDULE

# 正确写法
go run main.go "$CRON_SCHEDULE"

2. Docker环境中的传递

  • 用docker run传递时,直接带引号传值:
    docker run -e CRON_SCHEDULE="0 15 13 * * *" your-go-image
    
  • 在Dockerfile中设置ENV时,直接写原值:
    ENV CRON_SCHEDULE="0 15 13 * * *"
    

Docker会原样把环境变量传递给容器,只要容器内启动Go程序时不通过未加引号的shell变量引用,就不会出问题。

3. 关于转义的误区

你之前转义成0 15 13 \* \* \*是多余的,cron库需要的是纯*字符,转义后的\*会被当成无效表达式。问题根本不在变量值的转义,而是shell引用变量的方式。

4. 快速验证方法

在Circle CI的job里加一步run: echo "$CRON_SCHEDULE",如果输出是0 15 13 * * *,说明变量传递正确;如果还是文件列表,检查是不是引用变量时没加双引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:12:12