使用 eval 在变量中执行命令

使用 eval 在变量中执行命令

我正在尝试使用 grep 为一些日志文件着色。我写了一个脚本,其中一部分如下所示:

#!/bin/bash
com="GREP_COLOR=\"1;36\" egrep --color=always  '[^a-zA-Z0-9]' $log |less -R"
log="/var/log/syslog"
eval $com

执行过程中缺少 $log !

我试过这个:

#!/bin/bash
com="`GREP_COLOR=\"1;36\" egrep --color=always  '[^a-zA-Z0-9]' $log |less -R`"
log="/var/log/syslog"
eval $com

什么都没发生 !

你能看出我的代码有什么错误吗?

答案1

不使用eval

在这里,它完全可以避免:

function color_log() {
  log=$1
  GREP_COLOR="1;36" egrep --color=always '[^a-zA-Z0-9]' $log | less -R
}

color_log "/var/log/syslog"

答案2

您需要在第一个脚本中转义$in :$log

#!/bin/bash
com="GREP_COLOR=\"1;36\" egrep --color=always  '[^a-zA-Z0-9]' \$log |less -R"
log="/var/log/syslog"
eval $com

编辑:

在这种特殊情况下确实没有必要使用eval,因此建议像 ДМИТРИЙ 那样的替代且更安全的方法绝对是首选。另一方面,虽然设计错误是eval首先使用,但我解决的编码错误不是引用$log。虽然eval由于与之相关的所有漏洞而肯定有合理的负面新闻,但它仍然是一个非常强大的指令,值得了解。仔细编写评估可以避免恶意或意外的代码执行。

相关内容