Kas ir "eval" komanda bash?

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..

Risinājums

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
  1. Pirmajā rindā jūs definējat $foo ar vērtību '10' un $x ar vērtību 'foo'.
  2. Tagad definējiet $y, kas sastāv no virknes '$foo'. Dolāra zīmei jābūt izvadītai ar '$'$'.
  3. Lai pārbaudītu rezultātu, ierakstiet echo $y.
  4. Rezultāts būs virkne '$foo'.
  5. Tagad atkārtojam piešķiršanu ar 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.
  6. Tagad 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.

Komentāri (6)

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

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.

Komentāri (0)

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.

Komentāri (0)