首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逃逸信号

逃逸信号
EN

Stack Overflow用户
提问于 2018-01-22 23:17:49
回答 2查看 5.8K关注 0票数 3

我有以下代码:

代码语言:javascript
复制
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

我的问题是我得到的结果是:

代码语言:javascript
复制
cd /home/ubuntu/ansible '&&' ansible-playbook --extra-vars env=test playbooks/secrets/write.yml

我的意思是,由于某种奇怪的原因,双密码被逃脱了。我怎样才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-22 23:30:31

&&并没有真正被转义;它只是在一个简单的命令中没有特殊的意义。

当你写这样的东西时:

代码语言:javascript
复制
foo && bar

Bash将其解释为两个单独的简单命令-- foobar --由控制操作符&&连接。

但是当你写这样的东西时:

代码语言:javascript
复制
cmd='foo && bar'
$cmd

您只有一个简单的命令,$cmd。Bash执行参数替换(将$cmd替换为foo && bar)和分字(将foo && bar替换为foo && bar),但它不搜索任何特殊字符,如&&>|'

要解决这个问题,您需要使用不同的方法。在您的示例中,最好消除额外的间接影响:

代码语言:javascript
复制
  cd "$ansible_dir" && ansible-playbook --extra-vars env="${ENV}" "${@}"

但是在一个更复杂的例子中,您可能会发现编写助手函数很有帮助。

票数 4
EN

Stack Overflow用户

发布于 2018-01-22 23:27:35

代码语言:javascript
复制
cmd="cd $ansible_dir && ..."

不能在变量中使用build命令,只有在解释了像&&这样的特殊语法之后,变量才会展开。

但我不明白您为什么要这么做,为什么不直接执行cd命令呢?

代码语言:javascript
复制
ansible_run() {
  ansible_dir=$(ansible_work_dir)
  cd $ansible_dir && ansible-playbook --extra-vars env="${ENV}" "$@"
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48391786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档