【问题标题】:Bash: executing a command stored in a variable [duplicate]Bash:执行存储在变量中的命令
【发布时间】:2017-11-28 10:49:17
【问题描述】:

我正在编写一个脚本,但其中一部分没有按预期工作。

为了简单起见,我在一个简单的例子中分解了这部分:

echo 'echo "" > tmp' | while read cmd; do  $cmd ; done

这里我希望 $cmd 执行完整的命令“echo”> tmp。

但是会发生这种情况:

"" > tmp

执行的命令从字面上回显“”> tmp。而不是回显“”并将其重定向到文件 tmp.显然,将命令存储在 $cmd 中然后尝试执行时出现问题。

即使我进一步简化,结果也是一样的:

cmd="echo "" > tmp"
$cmd
> tmp

我尝试了''""的不同用法,但还没有解决。

【问题讨论】:

标签: bash


【解决方案1】:

使用eval执行存储在变量中的命令:

echo 'echo "" > tmp' | while read cmd; do eval "$cmd" ; done

cmd 的值将是echo "" > tmp。那么当 Bash 将参数替换解析为命令时,"" > tmp 部分将是echo 的字符串参数,不会被识别为>(重定向)。所以它只会输出参数部分。

同:$(echo 'echo "" > tmp')

【讨论】:

  • 警告:eval 拥有当之无愧的吸虫器声誉。当您对其进行测试时,它往往效果很好,但是当您在真实数据上运行它时,它偶尔会导致奇怪的结果。根据我的经验,如果eval 看起来像答案,这通常意味着您提出了错误的问题,并且确实应该支持并为您要解决的潜在问题寻找不同的方法。
  • @GordonDavisson 只是为了清楚起见:那么你能提供一个替代解决方案吗?谢谢。
  • @AlmirCampos 这取决于更大的情况。您必须查看为什么要尝试运行存储在变量中的命令,以及是否有更好的方法来解决更大的问题(通常有)。如果没有,命令的某些部分是否可能包含危险/易解析的 shell 语法,您是否有办法引用/转义它们以避免出现问题?
【解决方案2】:

改变

do  $cmd ;

do  eval  "$cmd" ;

【讨论】:

  • 在zhenguoli的回答下查看我的评论。另外,如果您必须使用eval,至少双引号该变量以避免一些真的奇怪的错误。
  • @GordonDavisson Point 指出......是的双引号主要是为了防止分词......
猜你喜欢
  • 2023-04-07
  • 2020-07-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2023-03-26
相关资源
最近更新 更多