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

最初のスクリプトからエスケープする必要があります$$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最初に使用して解決したコーディングエラーは参考になりませんでした$logeval関連するすべての脆弱性により、間違いなく正当な否定的なメディア報道がありますが、これは依然として知る価値がある非常に強力なガイドラインです。注意深く書かれた評価は、悪意のあるまたは偶発的なコードの実行を防ぐことができます。

関連情報