【问题标题】:Interpreting command substitution from a variable in bash从 bash 中的变量解释命令替换
【发布时间】:2012-07-17 21:45:25
【问题描述】:

对于FOO的以下值:

$ FOO='echo `echo hello`'
$ $FOO
`echo hello`

我怎样才能得到预期的输出:

hello

基本上,如何解释变量内容中的命令替换?

【问题讨论】:

  • 这不是 XY 问题。这是一个合法问题的合法问题,在我的特殊情况下,这是完成我需要做的事情的唯一方法(请参阅我在答案中的评论)。我可以包含有关我的设置的详细信息以及我在环境变量中使用命令替换的原因,但这超出了为问题提供答案(以及任何预防性警告)的范围。

标签: bash environment-variables command-substitution


【解决方案1】:

按照给定的问题回答,

eval $FOO

但您可能以错误的方式解决真正的问题。

【讨论】:

  • 这是正确的,但我不能让自己支持它,因为它包含单词eval
  • @suvayu 这是一个安全风险,因为您可能无法完全控制它作为参数获取的字符串的值。它类似于 SQL 注入攻击。在这个例子中,如果可能的话,攻击者可能会偷偷FOO="rm -rf /" into the code. It's safer to avoid eval`(通常是这样)。
  • 这是一个(不那么)简单的宏,它执行一个 shell 脚本,其中包含命令替换。我需要通过环境变量传递脚本,然后原子地执行它。因此,在这种情况下,安全性不是问题。
【解决方案2】:

试试这个

$ FOO="echo `echo hello`"
$ $FOO 

只需将单引号替换为双引号

【讨论】:

  • 从问题的措辞来看,我认为单引号是故意的。 OP 希望将命令替换推迟到变量展开为止。
  • 看到我认为他正在使用命令并且没有得到正确的输出......这就是为什么我回答说“只需用双引号替换单引号”......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2017-04-16
  • 2017-05-03
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多