我有以下代码:
ANSIBLE_WORK_DIR=${ANSIBLE_WORK_DIR:-$(pwd)/ansible}
ansible_work_dir() {
echo "${ANSIBLE_WORK_DIR}"
}
ansible_run() {
local cmd
ansible_dir=$(ansible_work_dir)
cmd="cd $ansible_dir && ansible-playbook --extra-vars env=${ENV}"
$cmd "${@}"
}
ansible_run playbooks/secrets/write.yml我的问题是我得到的结果是:
cd /home/ubuntu/ansible '&&' ansible-playbook --extra-vars env=test playbooks/secrets/write.yml我的意思是,由于某种奇怪的原因,双密码被逃脱了。我怎样才能解决这个问题?
发布于 2018-01-22 23:30:31
&&并没有真正被转义;它只是在一个简单的命令中没有特殊的意义。
当你写这样的东西时:
foo && barBash将其解释为两个单独的简单命令-- foo和bar --由控制操作符&&连接。
但是当你写这样的东西时:
cmd='foo && bar'
$cmd您只有一个简单的命令,$cmd。Bash执行参数替换(将$cmd替换为foo && bar)和分字(将foo && bar替换为foo && bar),但它不搜索任何特殊字符,如&&或>、|或'。
要解决这个问题,您需要使用不同的方法。在您的示例中,最好消除额外的间接影响:
cd "$ansible_dir" && ansible-playbook --extra-vars env="${ENV}" "${@}"但是在一个更复杂的例子中,您可能会发现编写助手函数很有帮助。
发布于 2018-01-22 23:27:35
cmd="cd $ansible_dir && ..."不能在变量中使用build命令,只有在解释了像&&这样的特殊语法之后,变量才会展开。
但我不明白您为什么要这么做,为什么不直接执行cd命令呢?
ansible_run() {
ansible_dir=$(ansible_work_dir)
cd $ansible_dir && ansible-playbook --extra-vars env="${ENV}" "$@"
}https://stackoverflow.com/questions/48391786
复制相似问题