Hva kan du gjøre med kommandoen eval
? Hvorfor er det nyttig? Er det en slags innebygd funksjon i bash? Det er ingen man
side for det ...
eval` er en del av POSIX. Det er et grensesnitt som kan være et innebygd skall.
Det er beskrevet i "POSIX Programmerer " s Manual ": http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Det vil ta et argument og konstruere en kommando av det, som vil bli utført av skallet. Dette er eksemplet på manpage:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
med verdien '10'
og $x
med verdien 'foo'
.$y
, som består av strengen '$foo'
. Dollartegnet må escapes
med '$'
.echo $y
.'$foo'
.eval
. Den vil først evaluere $x
til strengen 'foo'
. Nå har vi utsagnet y=$foo
som vil bli evaluert til y=10
.echo $y
er nå verdien '10'
.Dette er en vanlig funksjon i mange språk, f.eks. Perl og JavaScript. Ta en titt på perldoc eval for flere eksempler: http://perldoc.perl.org/functions/eval.html.
Ja, eval
er en intern bash-kommando, så den er beskrevet i bash
man-siden.
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.
Vanligvis brukes den i kombinasjon med en Command Substitution. Uten en eksplisitt eval
prøver skallet å utføre resultatet av en kommandosubstitusjon, ikke å evaluere det.
Si at du ønsker å kode en ekvivalent til VAR=verdi; echo $VAR
. Legg merke til forskjellen i hvordan skallet håndterer skrivingen av echo VAR=verdi
:
andcoz@...:~> $( echo VAR=verdi )
bash: VAR=verdi: kommando ikke funnet
andcoz@...:~> echo $VAR
<tom linje>
Skallet prøver å utføre echo
og VAR=verdi
som to separate kommandoer. Det kaster en feil om den andre strengen. Oppdraget forblir ineffektivt.
2.
andcoz@...:~> eval $( echo VAR=verdi )
andcoz@...:~> echo $VAR
verdi
Skallet slår sammen (konkatenerer) de to strengene echo
og VAR=verdi
, analyserer denne ene enheten i henhold til passende regler og utfører den.
Sist, men ikke minst, kan eval
være en veldig farlig kommando. All input til en eval
-kommando må kontrolleres nøye for å unngå sikkerhetsproblemer.
eval
har ingen man-side fordi det ikke er en separat ekstern kommando, men heller en skall innebygd, noe som betyr en kommando som er intern i og bare kjent av skallet (bash
). Den relevante delen av bash
man-siden sier:
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
I tillegg er utdata hvis 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.
eval
er en kraftig kommando, og hvis du har tenkt å bruke den, bør du være veldig forsiktig for å avverge de mulige sikkerhetsrisikoene som følger med den.