Ko varat darīt ar komandu eval
? Kāpēc tā ir noderīga? Vai tā ir kāda iebūvēta bash funkcija? Tai nav man
lapas..
eval
ir POSIX daļa. Tā ir saskarne, kas var būt iebūvēta čaulā.
Tā aprakstīta "POSIX programmētāja rokasgrāmatā": http://www.unix.com/man-page/posix/1posix/eval/.
eval - construct command by concatenating arguments
Tas pieņems argumentu un no tā konstruēs komandu, ko izpildīs čaulas programma. Šis ir manlapas piemērs:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
ar vērtību '10'
un $x
ar vērtību 'foo'
.$y
, kas sastāv no virknes '$foo'
. Dolāra zīmei jābūt izvadītai
ar '$'$'
.echo $y
.'$foo'
.eval
. Tas vispirms $x
vispirms novērtēs kā virkni 'foo'
. Tagad mums ir izteikums y=$foo
, kas tiks novērtēts kā y=10
.echo $y
rezultāts ir vērtība '10'
.Šī ir daudzās valodās, piemēram, Perl un JavaScript, izplatīta funkcija. Vairāk piemēru meklējiet perldoc eval: http://perldoc.perl.org/functions/eval.html.
Jā, eval
ir bash iekšējā komanda, tāpēc tā ir aprakstīta bash
man lapā.
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.
Parasti to izmanto kombinācijā ar Komandu aizvietošana. Bez skaidri izteiktas eval
, apvalks mēģina izpildīt komandas aizvietošanas rezultātu, nevis to novērtēt.
Pieņemsim, ka vēlaties kodēt ekvivalentu VAR=vērtība; echo $VAR
. Ievērojiet atšķirību, kā čaulas apstrādā echo VAR=vērtība
rakstīšanu:
andcoz@...:~> $( echo VAR=vērtība )
bash: VAR=vērtība: komanda nav atrasta
andcoz@...:~> echo $VAR
<tukša rinda>
Apvalks mēģina izpildīt echo
un VAR=vērtība
kā divas atsevišķas komandas. Tā izmet kļūdu par otro virkni. Piešķiršana paliek neefektīva.
2.
andcoz@...:~> eval $( echo VAR=vērtība )
andcoz@...:~> echo $VAR
value
Apvalks apvieno (concatenates) abas virknes echo
un VAR=vērtība
, izanalizē šo vienotu vienību atbilstoši attiecīgajiem noteikumiem un izpilda to.
Pēdējā, bet ne mazāk svarīgā komanda eval
var būt ļoti bīstama. Lai izvairītos no drošības problēmām, rūpīgi jāpārbauda visi eval
komandai ievadītie dati.
eval
nav man lapas, jo tā nav atsevišķa ārēja komanda, bet gan iebūvēta čaulā, t.i., čaulas iekšējā komanda, ko pazīst tikai čaula (bash
). Attiecīgajā bash
man lapas daļā teikts:
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
Turklāt izvades rezultāts, ja help eval
ir šāds:
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
ir spēcīga komanda, un, ja plānojat to izmantot, jums jābūt ļoti uzmanīgam, lai novērstu iespējamos drošības riskus, kas ar to saistīti.