Ce puteți face cu comanda eval
? De ce este utilă? Este un fel de funcție încorporată în bash? Nu există o pagină man
pentru aceasta..
eval
face parte din POSIX. Este o interfață care poate fi încorporată în shell.
Este descrisă în "POSIX Programmer's Manual": http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Acesta va lua un argument și va construi o comandă din acesta, care va fi executată de shell. Acesta este exemplul din pagina de manual:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
cu valoarea '10'
și $x
cu valoarea 'foo'
.$y
, care constă în șirul '$foo'
. Semnul dolarului trebuie să fie scăpat
cu '$'
.echo $y
.'$foo'
.eval
. Acesta va evalua mai întâi $x
la șirul 'foo'
. Acum avem instrucțiunea y=$foo
care va fi evaluată la y=10
.echo $y
este acum valoarea '10'
.Aceasta este o funcție comună în multe limbaje, de exemplu Perl și JavaScript. Aruncați o privire la perldoc eval pentru mai multe exemple: http://perldoc.perl.org/functions/eval.html
Da, eval
este o comandă internă bash, deci este descrisă în pagina 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.
De obicei, este utilizată în combinație cu o Substituire de comandă. Fără o eval
explicită, shell-ul încearcă să execute rezultatul unei substituții de comandă, nu să îl evalueze.
Să spunem că doriți să codificați un echivalent al VAR=valoare; echo $VAR
. Observați diferența în modul în care shell-ul tratează scrierile din echo VAR=valoare
:
andcoz@...:~> $( echo VAR=valoare )
bash: VAR=valoare: comanda nu a fost găsită
andcoz@...:~> echo $VAR
<linie goală>
Shell-ul încearcă să execute echo
și VAR=valoare
ca două comenzi separate. Se aruncă o eroare cu privire la al doilea șir. Atribuirea rămâne ineficientă.
2.
andcoz@...:~> eval $( echo VAR=valoare )
andcoz@...:~> echo $VAR
valoare
Shell-ul fuzionează (concatenează) cele două șiruri echo
și VAR=valoare
, analizează această unitate unică în conformitate cu regulile corespunzătoare și o execută.
Nu în ultimul rând, eval
poate fi o comandă foarte periculoasă. Orice intrare la o comandă eval
trebuie verificată cu atenție pentru a evita problemele de securitate.
eval
nu are o pagină de manual deoarece nu este o comandă externă separată, ci mai degrabă o comandă încorporată în shell, adică o comandă internă și cunoscută doar de shell (bash
). Partea relevantă a paginii de manual bash
spune așa:
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
În plus, rezultatul dacă help eval
este:
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.
eval
este o comandă puternică și, dacă intenționați să o utilizați, trebuie să fiți foarte atenți pentru a evita posibilele riscuri de securitate care o însoțesc.