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

Azure Pipelines中Bash函数参数无法传递的原因与解决办法

问题分析与修复方案

问题原因

第一个script步骤里,$@在YAML的 heredoc(<<END)语法中被提前解析了。因为YAML的script块默认会由当前shell处理,当你写echo "Arguments are: $@"时,这个$@会在执行cat命令的shell中展开——而此时这个shell没有任何参数,所以$@被替换成空字符串,最终写入ci_bash_env.sh的函数变成了echo "Arguments are: ",调用时自然无法传递参数。

修复方法

只要阻止YAML对$@的提前解析就行,两种简单方法:

方法1:转义美元符号

在$@前加反斜杠,让shell不提前解析变量:

pool:
      vmImage: 'ubuntu-latest'

steps:
  - script: |
      cat >> ~/ci_bash_env.sh <<END
        my_function() {
          echo "Arguments are: \$@"
        }
      END
  - script: |
      source ~/ci_bash_env.sh
      my_function 123

方法2:用单引号包裹heredoc标记

把<<END改成<<'END',这样整个heredoc内容会被当作纯字符串,不会解析里面的变量:

pool:
      vmImage: 'ubuntu-latest'

steps:
  - script: |
      cat >> ~/ci_bash_env.sh <<'END'
        my_function() {
          echo "Arguments are: $@"
        }
      END
  - script: |
      source ~/ci_bash_env.sh
      my_function 123

Docker实验正常的原因

你在Docker里的操作是把函数写入文件后,通过BASH_ENV让bash加载环境脚本,再执行调用脚本。这个过程中,$@是在函数被调用时才会解析,没有被提前替换,所以能正常获取到传递的参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:22:20