Kaj lahko naredite z ukazom eval
? Zakaj je uporaben? Je to nekakšna vgrajena funkcija v bashu? Zanjo ni strani man
..
eval
je del standarda POSIX. Je vmesnik, ki je lahko vgrajen v lupino.
Opisan je v "Priročniku za programerje POSIX": http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Sprejme argument in iz njega sestavi ukaz, ki ga izvede lupina. To je primer priročnika:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
z vrednostjo '10'
in $x
z vrednostjo 'foo'
.$y
, ki je sestavljen iz niza '$foo'
. Znak dolarja mora biti eskapiran
z '$'
.echo $y
.'$foo'
eval
. Najprej bo ovrednotil $x
v niz 'foo'
. Zdaj imamo stavek y=$foo
, ki bo ovrednoten v y=10
.echo $y
je zdaj vrednost '10'
.To je pogosta funkcija v številnih jezikih, npr. v Perlu in JavaScriptu. Za več primerov si oglejte perldoc eval: http://perldoc.perl.org/functions/eval.html
Da, eval
je notranji ukaz basha, zato je opisan v priročniku 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.
Običajno se uporablja v kombinaciji z Zastopanje ukaza. Brez izrecnega ukaza eval
poskuša lupina izvršiti rezultat zamenjave ukaza, ne pa ga vrednotiti.
Recimo, da želite kodirati ekvivalent VAR=vrednost; echo $VAR
. Upoštevajte razliko v tem, kako lupina obravnava zapis echo VAR=value
:
andcoz@...:~> $( echo VAR=value )
bash: VAR=vrednost: ukaz ni najden
andcoz@...:~> echo $VAR
<prazna vrstica>
Ovojnica poskuša izvesti echo
in VAR=value
kot dva ločena ukaza. Pri drugem nizu vrže napako. Pripis ostane neučinkovit.
2.
andcoz@...:~> eval $( echo VAR=vrednost )
andcoz@...:~> echo $VAR
value
Lupina združi (konkatenzira) oba niza echo
in VAR=vrednost
, to enotno enoto razčleni po ustreznih pravilih in jo izvrši.
Nenazadnje je lahko ukaz eval
zelo nevaren. Vsak vnos v ukaz eval
je treba skrbno preveriti, da bi se izognili varnostnim težavam.
Ukaz eval
nima priročniške strani, ker ni ločen zunanji ukaz, temveč vgrajeni ukaz lupine, kar pomeni ukaz, ki je notranji in ga pozna samo lupina (bash
). Ustrezni del priročniške strani bash
pravi:
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
Poleg tega je izpis, če je help eval
, naslednji:
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
je močan ukaz in če ga nameravate uporabljati, morate biti zelo previdni, da preprečite morebitna varnostna tveganja, ki so povezana z njim.