Execução de um comando em uma variável com eval

1

Estou tentando usar o grep para colorir alguns arquivos de log. Eu escrevi um script e uma parte dele se parece com isso:

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

A execução estava faltando $ log!

Eu tentei isso:

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

Nada aconteceu!

Você pode ver algum erro no meu código?

    
por 4m1nh4j1 20.10.2013 / 18:01

2 respostas

5

Não use eval .

Bem aqui, simplesmente poderia ser evitado:

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

color_log "/var/log/syslog"
    
por 20.10.2013 / 18:25
3

Você precisa escapar do $ em $log no seu primeiro script:

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

Editar:

Na verdade, não há necessidade de usar eval neste caso em particular, de modo que sugerir uma maneira alternativa e mais segura como a ДМИТРИЙ fez é definitivamente preferida. Por outro lado, enquanto o erro de design era usar eval , o erro de codificação que eu abordei não era para citar $log . Embora eval definitivamente tenha uma má imprensa justificada por causa de todas as vulnerabilidades associadas a ela, é, no entanto, uma instrução muito poderosa que vale a pena conhecer. Os evals cuidadosamente escritos podem evitar a execução de códigos maliciosos ou inesperados.

    
por 20.10.2013 / 18:10

Tags