bash - 在 bash 中转义符号

标签 bash

我有以下代码:

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 将其解释为两个单独的简单命令 — foobar — 由控制运算符 && 连接。

但是当你这样写的时候:

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/

相关文章:

bash - 捕获 perl 脚本内的 bash 输出值

python - 在 python 中调用 bsub 函数时将参数传递给 bash 脚本

python - 将参数传递给 Python subprocess.Popen

linux - 创建一个在压缩时会失败的文件

linux - 仅为特定配置文件更改 pom 属性

linux - 我设置了 .bashrc 但我的 promt 看起来还是一样

python - -bash : !/usr/bin/env: 找不到事件

linux - Bash 检查环境变量设置在环境变量数组中

git - 通过命令行在 Git 提交消息中使用撇号(单引号)

mysql - 精确时间之间的查询