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
相关产品推荐
相关产品推荐

