O que você pode fazer com o comando "eval"? Por que ele é útil? É algum tipo de função integrada na bash? Não existe uma página de "homem" para ele...
O "eval" faz parte do POSIX. É uma interface que pode ser uma shell embutida.
Está descrito no "Programador POSIX's Manual": http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Será necessário um argumento e construir um comando, que será executado pela concha. Este é o exemplo da manpage:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
com o valor '10'
e $x
com o valor 'foo'
.$y
, que consiste na string '$foo'
. O sinal do dólar tem de ser fugido.
com '$'
.echo $y
.'$foo'
.eval
. Primeiro avaliará $x
para a string 'foo'
. Agora temos a declaração y=$foo
que será avaliada para y=10
.echo $y
é agora o valor '10'
.Esta é uma função comum em muitas linguagens, por exemplo, Perl e JavaScript. Dê uma olhada em perldoc eval para mais exemplos: http://perldoc.perl.org/functions/eval.html
Sim, eval
é um comando interno bash, por isso é descrito na página de manual bash
.
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
Normalmente é usado em combinação com um Command Substitution. Sem um `aval' explícito, a shell tenta executar o resultado de uma substituição de comando, e não avaliá-lo.
Diga que você quer codificar um equivalente de VAR=valor; echo $VAR
. Note a diferença em como a shell lida com as escritas de echo VAR=valor
:
andcoz@...:~> $( echo VAR=value )
esmagar: VAR=valor: comando não encontrado
andcoz@...:~> echo $VAR
< linha vazia>
A shell tenta executar echo
e VAR=value
como dois comandos separados. Ele lança um erro sobre a segunda string. A atribuição permanece ineficaz.
2.
andcoz@...:~> eval $( echo VAR=value )
andcoz@...:~> echo $VAR
valor
A casca funde (concatena) as duas cordas echo
e VAR=valor
, analisa esta única unidade de acordo com regras apropriadas e a executa.
Por último, mas não menos importante, o eval
pode ser um comando muito perigoso. Qualquer entrada para um comando eval
deve ser cuidadosamente verificada para evitar problemas de segurança.
O eval
não tem página de manual porque não é um comando externo separado, mas sim uma shell incorporada, ou seja, um comando interno e conhecido apenas pela shell (bash
). A parte relevante da página de manual `bash' diz:
eval [arg ...]
The args are read and concatenated together into a single command.
This command is then read and executed by the shell, and its exit
status is returned as the value of eval. If there are no args, or only
null arguments, eval returns 0
Além disso, a saída se help eval
é:
eval: eval [arg ...]
Execute arguments as a shell command.
Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.
Exit Status:
Returns exit status of command or success if command is null.
O 'eval' é um comando poderoso e se você pretende utilizá-lo, deve ter muito cuidado para evitar os possíveis riscos de segurança que o acompanham.