我有以下代码:
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
我的意思是出于某种奇怪的原因,双符号被转义了。我该如何解决这个问题?
最佳答案
&&
并没有真正被转义;只是在简单的命令中没有特殊意义。
当你这样写的时候:
foo && bar
Bash 将其解释为两个单独的简单命令 — foo
和 bar
— 由控制运算符 &&
连接。
但是当你这样写的时候:
cmd='foo && bar'
$cmd
你只有一个简单的命令,$cmd
。 Bash 执行参数替换(将 $cmd
替换为 foo && bar
)和分词(将 foo && bar
替换为 foo
&&
bar
),但它不会搜索任何特殊字符,例如 &&
或 >
或|
或 '
。
要解决此问题,您需要使用不同的方法。在您的示例中,您最好只消除额外的间接寻址:
cd "$ansible_dir" && ansible-playbook --extra-vars env="${ENV}" "${@}"
但在更复杂的示例中,您可能会发现编写辅助函数很有帮助。
关于bash - 在 bash 中转义符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391786/