如何让Packer正确执行echo -e命令?
解决Packer中echo -e执行不符合预期的问题
问题原因
Packer的shell provisioner默认使用dash(Debian/Ubuntu系统的默认sh),而dash的echo命令不支持-e选项,会把-e直接当作输出内容,导致出现你遇到的异常结果。
解决方案
方案1:明确用bash执行命令
把inline命令用bash -c包裹,强制使用支持-e参数的bash版echo:
provisioner "shell" { environment_vars = [ "DEBIAN_FRONTEND=noninteractive", ] inline = [ "bash -c 'echo -e \"new\nline\" | tee -a /home/ubuntu/new_file.txt'", ] }
方案2:改用printf命令(推荐,跨平台兼容性更好)
printf本身支持转义字符,无需依赖echo的-e选项,稳定性更强:
provisioner "shell" { environment_vars = [ "DEBIAN_FRONTEND=noninteractive", ] inline = [ "printf \"new\nline\n\" | tee -a /home/ubuntu/new_file.txt", ] }
注意末尾要额外加\n,因为printf不会像echo那样自动追加换行符。
方案3:指定shell provisioner使用bash
在shell provisioner配置中直接指定使用bash,让整个脚本都以bash环境执行:
provisioner "shell" { environment_vars = [ "DEBIAN_FRONTEND=noninteractive", ] shell = "/bin/bash" inline = [ "echo -e \"new\nline\" | tee -a /home/ubuntu/new_file.txt", ] }
内容的提问来源于stack exchange,提问作者Josh Correia
相关产品推荐
相关产品推荐

