eval
විධානය සමඟ ඔබට කුමක් කළ හැකිද? එය ප්රයෝජනවත් වන්නේ ඇයි? එය කිසියම් ආකාරයක ගොඩනංවන ලද කාර්යයක්ද? ඒ man
සඳහා පිටුවක් නොමැත ..
help eval
ඔබේ
eval
විධානය සමඟ ඔබට කුමක් කළ හැකිද? එය ප්රයෝජනවත් වන්නේ ඇයි? එය කිසියම් ආකාරයක ගොඩනංවන ලද කාර්යයක්ද? ඒ man
සඳහා පිටුවක් නොමැත ..
help eval
ඔබේ
Answers:
eval
POSIX හි කොටසකි. එහි අතුරුමුහුණත ෂෙල්-බිල්ට් විය හැකිය.
එය "POSIX Programmer's Manual" හි විස්තර කර ඇත: http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
එය තර්කයක් ගෙන එහි විධානයක් සාදනු ඇත, එය කවචය මඟින් ක්රියාත්මක කරනු ඇත. මෑන්පේජ් හි උදාහරණය මෙයයි:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
වටිනාකම සමග '10'
සහ $x
වටිනාකම සමග 'foo'
.$y
, එය නූල් වලින් සමන්විත වේ '$foo'
. ඩොලර් ලකුණ සමඟ ගැලවිය යුතුය '$'
.echo $y
.'$foo'
eval
. එය මුලින්ම නූලට තක්සේරු $x
කරනු ඇත 'foo'
. දැන් අපට ප්රකාශය ඇතy=$foo
ඇගයීමට ලක් කෙරේ y=10
.echo $y
දැන් වටිනාකමයි '10'
.මෙය බොහෝ භාෂාවල පොදු කාර්යයකි, උදා: පර්ල් සහ ජාවාස්ක්රිප්ට්. තවත් උදාහරණ සඳහා perldoc eval දෙස බලන්න: http://perldoc.perl.org/functions/eval.html
eval
එය ගොඩනඟන ලද්දක් මිස ශ්රිතයක් නොවේ. ප්රායෝගිකව, බිල්ට්-ඉන්ස් භාෂාවේ අර්ථ දැක්වීමක් නොමැති, නමුත් එතරම් ප්රමාණවත් නොවේ (ඔබ හැඳින්වෙන ශ්රිතයක් අර්ථ දැක්වීමට තරම් විකෘති වී ඇත්නම් eval
).
ඔව්, eval
එය අභ්යන්තර bash
පිටපතක් වන බැවින් එය man පිටුවේ විස්තර කෙරේ .
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.
සාමාන්යයෙන් එය විධාන ආදේශකයක් සමඟ ඒකාබද්ධව භාවිතා වේ . පැහැදිලි කිරීමකින් තොරව eval
, කවචය විධාන ආදේශනයක ප්රති result ලය ක්රියාත්මක කිරීමට උත්සාහ කරයි , ඇගයීමට නොවේ එය නොකරයි.
ඔබට සමාන කේත කිරීමට අවශ්ය බව පවසන්න VAR=value; echo $VAR
. කවචයේ ලේඛන හසුරුවන ආකාරයෙහි වෙනස සැලකිල්ලට ගන්න echo VAR=value
:
andcoz@...:~> $( echo VAR=value )
bash: VAR=value: command not found
andcoz@...:~> echo $VAR
<empty line>
ෂෙල් ක්රියාත්මක කිරීමට උත්සාහ echo
හා VAR=value
වෙනම විධාන දෙකක් ලෙස. එය දෙවන නූල පිළිබඳ දෝෂයක් විසි කරයි. පැවරුම අකාර්යක්ෂමයි.
andcoz@...:~> eval $( echo VAR=value )
andcoz@...:~> echo $VAR
value
කවචය නූල් දෙක ඒකාබද්ධ කරයි (සංයුක්ත කරයි) echo
සහ VAR=value
සුදුසු නීතිරීති අනුව මෙම තනි ඒකකය විග්රහ කර එය ක්රියාත්මක කරයි.අවසාන වශයෙන් නොව eval
ඉතා භයානක විධානයක් විය හැකිය. eval
ආරක්ෂක ගැටළු වළක්වා ගැනීම සඳහා විධානයකට ඕනෑම ආදානයක් ප්රවේශමෙන් පරීක්ෂා කළ යුතුය.
eval
මෑන් පිටුවක් නොමැති නිසා එය වෙනම බාහිර විධානයක් නොව ෂෙල් බිල්ට් ඉන් එකක් වන අතර එහි අර්ථය වන්නේ අභ්යන්තර විධානයක් වන අතර එය ෂෙල් ( bash
) මගින් පමණක් දන්නා කරුණකි . bash
මෑන් පිටුවේ අදාළ කොටසෙහි මෙසේ සඳහන් වේ:
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
ඊට අමතරව, ප්රතිදානය නම් 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
එය ප්රබල විධානයක් වන අතර ඔබ එය භාවිතා කිරීමට අදහස් කරන්නේ නම් එයින් ඇතිවිය හැකි ආරක්ෂක අවදානම් මඟහරවා ගැනීමට ඔබ ඉතා සැලකිලිමත් විය යුතුය .
Evval ප්රකාශය කවචයට පවසන්නේ eval ගේ තර්ක විධාන ලෙස ගෙන ඒවා විධාන රේඛාව හරහා ධාවනය කරන ලෙසයි. පහත දැක්වෙන තත්වයක් තුළ එය ප්රයෝජනවත් වේ:
ඔබේ ස්ක්රිප්ටයේ ඔබ විධානයක් විචල්යයක් ලෙස අර්ථ දක්වන්නේ නම් සහ පසුව ඔබට එම විධානය භාවිතා කිරීමට අවශ්ය නම් ඔබ භාවිතා කළ යුත්තේ eval:
/home/user1 > a="ls | more"
/home/user1 > $a
bash: command not found: ls | more
/home/user1 > # Above command didn't work as ls tried to list file with name pipe (|) and more. But these files are not there
/home/user1 > eval $a
file.txt
mailids
remote_cmd.sh
sample.txt
tmp
/home/user1 >
ls | more
. වෙනත් වචන වලින් කිවහොත්: තනි විධාන නාමය අක්ෂර 9 කින් සමන්විත වූ අතර අවකාශය සහ නල සංකේතය ද ඇතුළුව .
eval යනු ෂෙල් විධානයක් වන අතර එය සාමාන්යයෙන් බිල්ඩින් ලෙස ක්රියාත්මක වේ.
POSIX එය කොටසක් ලෙස ලැයිස්තුගත කර ඇත "2.14. විශේෂ Built-දී උපයෝගිතා" යන පිවිසුම් දී "eval" .
බිල්ඩින් යන්නෙන් අදහස් කරන්නේ:
“බිල්ට්-ඉන්” යන්නෙන් ගම්ය වන්නේ කවචයට උපයෝගීතාව කෙලින්ම ක්රියාත්මක කළ හැකි අතර එය සෙවීමට අවශ්ය නොවන බවයි.
සරල වචන වලින්: ආදාන රේඛාවක් දෙවරක් විග්රහ කිරීමට සලස්වයි .
කවචයට රේඛාවක් "සැකසීමට" අනුගමනය කරන පියවර මාලාවක් ඇත. ඔබට මෙම රූපය දෙස බලා වම් පස 1 වන පියවර දක්වා ඉහළට යන එකම රේඛාව එවාල් බව තේරුම් ගත හැකිය . සිට මෙම POSIX විස්තර :
2.1 ෂෙල් හැඳින්වීම
- කවචය එහි ආදානය කියවයි ....
- කවචය ආදානය ටෝකන බවට පත් කරයි: වචන සහ ක්රියාකරුවන්
- කවචය ආදානය සරල හා සංයුක්ත විධාන වලට විග්රහ කරයි.
- කවචය විවිධ පුළුල් කිරීම් සිදු කරයි (වෙන වෙනම) ...
- කවචය නැවත හරවා යැවීම සිදු කරන අතර නැවත හරවා යැවීමේ ක්රියාකරුවන් සහ ඒවායේ ක්රියාකාරිත්වය පරාමිති ලැයිස්තුවෙන් ඉවත් කරයි.
- කවචය මඟින් ශ්රිතයක්, ගොඩනංවන ලද, ක්රියාත්මක කළ හැකි ගොනුවක් හෝ ස්ක්රිප්ට් එකක් ක්රියාත්මක කරයි ...
- කවචය විකල්පයක් ලෙස විධානය සම්පුර්ණ වන තෙක් බලා සිටින අතර පිටවීමේ තත්වය එකතු කරයි.
6 වන පියවරේදී බිල්ට් එකක් ක්රියාත්මක වේ.
6 වන පියවරේදී, සැකසූ රේඛාව නැවත පියවර 1 වෙත යැවීමට හේතු වේ
. ක්රියාත්මක කිරීමේ අනුක්රමය පසුපසට යන එකම කොන්දේසිය එයයි.
ඒ නිසයි මම කියන්නේ: එවාල් සමඟ ආදාන රේඛාවක් දෙවරක් විග්රහ කෙරේ .
තේරුම් ගැනීමට වඩාත්ම වැදගත් බලපෑම. ඉහත දැක්වෙන ෂෙල් පියවර හතට රේඛාවක් යටත් වූ පළමු අවස්ථාවෙහි එක් ප්රති consequ ලයක් උපුටා දැක්වීමකි . 4 වන පියවර ඇතුළත (පුළුල් කිරීම්), සියලු පුළුල් කිරීම් සිදු කිරීම සඳහා පියවර මාලාවක් ද ඇත , එහි අවසාන කොටස මිල ගණන් ඉවත් කිරීම :
මිල ගණන් ඉවත් කිරීම සැමවිටම අවසන් වරට සිදු කෙරේ.
එබැවින්, සෑම විටම, උපුටා දැක්වීමේ එක් මට්ටමක් ඉවත් කර ඇත.
එම පළමු බලපෑමේ ප්රති ence ලයක් ලෙස, රේඛාවේ අතිරේක / විවිධ කොටස් ෂෙල් විග්රහයට සහ අනෙකුත් සියලුම පියවරයන්ට නිරාවරණය වේ.
එය වක්ර පුළුල් කිරීම් ක්රියාත්මක කිරීමට ඉඩ දෙයි:
a=b b=c ; eval echo \$$a ### shall produce "c"
මන්ද? පළමු පුඩුවේ පළමු වැන්න $
උපුටා දක්වන බැවිනි.
එනිසා එය කවචය මගින් පුළුල් කිරීම සඳහා නොසලකා හරිනු ලැබේ. A නමින්
ඊළඟට $
"b" නිෂ්පාදනය සඳහා පුළුල් වේ.
ඉන්පසුව, එක් මට්ටමේ උපුටා දැක්වීමක් ඉවත් කරනු ලැබේ $
.
පළමු පුඩුවේ අවසානය.
දෙවන ලූපය මත $b
ෂෙල් එකෙන් නූල කියවනු ලැබේ.
ඉන්පසු "c" දක්වා විස්තාරණය කර
තර්කයක් ලෙස දෙනු ලැබේ echo
.
පළමු ලූපය මත ඇති වන එළිදරව්ව "බැලීමට" (නැවත ඇගයීමට), echo භාවිතා කරන්න. හෝ තර්ක පැහැදිලිව පෙන්වන ඕනෑම විධානයක් / ස්ක්රිප්ට් / වැඩසටහනක්:
$ a=b b=c
$ eval echo \$$a;
c
සිදුවන්නේ කුමක්ද යන්න "බැලීමට" ප්රතිරාවය ප්රතිරාවය කරන්න:
$ echo echo \$$a
echo $b
පේළියක සියලුම "කොටස්" පෙන්වීමට ද හැකිය:
$ printf '<%s> ' echo \$$a
<echo> <$b>
මෙම උදාහරණයේ දී එක් ප්රතිරාවයක් සහ එක් විචල්යයක් පමණක් වන නමුත් වඩාත් සංකීර්ණ අවස්ථා ඇගයීමට එය මතක තබා ගන්න.
ඉහත සඳහන් කේතයේ වැරැද්දක් තිබේ, ඔබට එය දැකිය හැකිද?
පහසුයි: සමහර උපුටා දැක්වීම් නොමැත.
කොහොමද? ඔබට ඇසිය හැකිය. සරලයි, අපි විචල්යයන් වෙනස් කරමු (කේතය නොවේ):
$ a=b b="hi jk"
$ eval echo \$$a
hi jk
නැතිවූ අවකාශයන් බලන්න?
එයට හේතුව ඇතුළත අගය $b
ෂෙල් එකෙන් බෙදීමයි.
එය ඔබට ඒත්තු ගැන්වෙන්නේ නැත්නම්, මෙය උත්සාහ කරන්න:
$ a=b b="hi * jk"
$ eval echo \$$a ### warning this will expand to the list
### of all files in the present directory.
උපුටා දැක්වීම් අස්ථානගත වී ඇත. එය නිවැරදිව ක්රියාත්මක කිරීම සඳහා (අභ්යන්තර "$a"
හා බාහිර \"
උපුටා දැක්වීම් එක් කරන්න ).
මෙය උත්සාහ කරන්න (පරිපූර්ණ ආරක්ෂිතයි):
$ a=b b="hi * jk"
$ eval echo \" \$"$a" \"
hi * jk
ඒ සඳහා මෑන් පිටුවක් නොමැත ..
නැත, මේ සඳහා ස්වාධීන මෑන් පිටුවක් නොමැත. අත්පොත සෙවීම man -f eval
හෝ ඇතුළත් කිරීමක් apropos eval
නොපෙන්වයි.
එය ඇතුළත ඇතුළත් වේ man bash
. ඕනෑම සාදන ලද පරිදි.
"SHELL BUILTIN COMMANDS" සහ පසුව "eval" සඳහා සොයන්න.
උදව් ලබා ගැනීමට පහසු ක්රමයක් නම්: help eval
කඩිනමින්, ගොඩනංවන ලද උදව් බැලීමට ඔබට කළ හැකිය .
මන්ද එය ගතිකව කේත කිරීමට පෙළ බැඳී ඇති බැවිනි.
වෙනත් වචන වලින් කිවහොත්: එය එහි තර්ක ලැයිස්තුව (සහ / හෝ එවැනි තර්ක පුළුල් කිරීම) ක්රියාත්මක කරන ලද රේඛාවක් බවට පරිවර්තනය කරයි. කිසියම් හේතුවක් නිසා, ප්රහාරකයෙකු විසින් තර්කයක් සකසා ඇත්නම්, ඔබ ප්රහාරක කේතය ක්රියාත්මක කරනු ඇත.
නැතහොත් ඊටත් වඩා සරල නම්, තර්ක එකක හෝ කිහිපයක වටිනාකම නිර්වචනය කළ අයට ඔබ කියන්නේ:
කැමන්, මෙහි වාඩි වී ඕනෑම විධාන රේඛාවක් ටයිප් කරන්න, මම එය මගේ බලයෙන් ක්රියාත්මක කරමි.
එය භයානකද? එය එසේ බව සෑම කෙනෙකුටම පැහැදිලි විය යුතුය.
Eval සඳහා වන ආරක්ෂිත රීතිය විය යුත්තේ: ඔබ
විසින් විචල්යයන් මත eval පමණක් ක්රියාත්මක කරන්න එහි අගය ලබා දී ඇති .
වැඩි විස්තර මෙතැනින් කියවන්න .
eval
බොහෝ අර්ථ භාෂා (අංගයකි TCL
, python
, ruby
, ...) පමණක් නොව ෂෙල් වෙඩි. කේතය ගතිකව ඇගයීමට එය භාවිතා කරයි.
ෂෙල් වෙඩි වලදී එය ක්රියාත්මක වන්නේ ෂෙල් බිල්ඩින් විධානයක් වශයෙනි.
මූලික වශයෙන්, eval
තර්කයක් ලෙස නූලක් ගෙන එහි කේතය ඇගයීමට / අර්ථ නිරූපණය කරයි. ෂෙල් වෙඩි වලදී, eval
තර්ක එකකට වඩා ගත හැකිය, නමුත් eval
ඇගයීම සඳහා නූල සෑදීමට ඒවා සමපාත වේ.
එය ඉතා ප්රබල බැවින් ඔබට කේතය ගතිකව ගොඩනඟා එය ක්රියාත්මක කළ හැකිය, සී වැනි සංයුක්ත භාෂාවලින් ඔබට කළ නොහැකි දෙයක්.
මෙන්:
varname=$1 varvalue=$2
eval "$varname=\$varvalue" # evaluate a string like "foo=$varvalue"
# which in Bourne-like shell language
# is a variable assignment.
නමුත් එය eval
ෂෙල් කේතය ලෙස අර්ථකථනය කර ඇති හේතුවෙන්ම ලබා දෙන ගතික (බාහිරව සපයා ඇති) කොටස් සනීපාරක්ෂාව කිරීම වැදගත් බැවින් එය ද භයානක ය .
උදාහරණයක් වශයෙන්, නම් ඉහත $1
වේ evil-command; var
, eval
අගැයීමට ලක්කිරීමේ අවසන්-ඇතැයි evil-command; var=$varvalue
ෂෙල් කේතය එවිට ඒ ක්රියාත්මක evil-command
.
නපුරුකම eval
බොහෝ විට අතිශයෝක්තියට නංවයි.
හරි, එය භයානකයි, නමුත් අවම වශයෙන් එය භයානක බව අපි දනිමු.
අනෙකුත් විධානයන් ගොඩක් ෂෙල් කේතය සිය තර්ක දී සැර බාල කෙරුනු නොවේ නම්, (ෂෙල් මත පදනම්ව) වැනි, බලනු ඇත [
හෙවත් test
, export
, printf
, GNU sed
, awk
, හා එක් එක් පාඨමාලාව sh
/ bash
/ perl
සහ සියලු භාෂණ ...
උදාහරණ (මෙහි uname
දී evil-command
සහ $a
බාහිරව සපයන ලද සනීපාරක්ෂක නොවන දත්ත ලෙස භාවිතා කිරීම):
$ a='$(uname>&2)' sh -c 'eval "echo $a"'
Linux
$ a='x[0$(uname>&2)]' mksh -c 'export "$a=$b"'
Linux
$ a='x[0$(uname>&2)]' ksh93 -c 'printf "%d\n" "$a"'
Linux
0
$ a='x[0$(uname>&2)]' ksh93 -c '[ "$a" -gt 0 ]'
Linux
$ a=$'bar/g;e uname>&2\n;s//'; echo foo | sed "s/foo/$a/g"
Linux
bar
$ a='";system("uname");"'; awk "BEGIN{print \"$a\"}"
Linux
$ a=';uname'; sh -c "echo $a"
Linux
ඒවා sed
, export
... විධානයන් වඩාත් භයානක ලෙස සැලකිය හැකිය, මන්ද එය පැහැදිලිව පෙනෙන eval "$var"
නමුත් අන්තර්ගතය $var
ෂෙල් කේතය ලෙස ඇගයීමට ලක් කරනු ඇත, එය එතරම් පැහැදිලිව sed "s/foo/$var/"
හෝ export "$var=value"
හෝ නැත [ "$var" -gt 0 ]
. අන්තරාදායකත්වය එක හා සමානයි, නමුත් එය අනෙක් විධානයන් තුළ සැඟවී ඇත.
sed
වැනි eval
වැලක් විචල්ය අඩංගු සම්මත කොට ඇත, සහ යන දෙකම සඳහා, සිප්පි කටු කේතය ලෙස ඇගයීමට ලක් කරමින් දක්වා එම string අවසන් අන්තර්ගතය, ඒ නිසා sed
ලෙස දරුණු ලෙස ය eval
, ඒ තමයි මම කියන්නේ. (uname මෙතෙක් ක්රියාත්මක කර නොමැත) sed
අඩංගු නූලක් සම්මත uname
කර ඇති අතර, ආයාචනය කිරීමෙන් sed
, uname විධානය ක්රියාත්මක වේ. Evval වගේ. තුළ sed 's/foo/$a/g'
, ඔබ සනීපාරක්ෂක දත්ත වෙත නොයෙදේ sed
, අප මෙහි කතා කරන්නේ එය නොවේ.
මෙම උදාහරණයෙන් යම් ආලෝකයක් ලැබිය හැකිය:
#!/bin/bash
VAR1=25
VAR2='$VAR1'
VAR3='$VAR2'
echo "$VAR3"
eval echo "$VAR3"
eval eval echo "$VAR3"
ඉහත පිටපතෙහි ප්රතිදානය:
$VAR2
$VAR1
25
eval
. එහි ක්රියාකාරිත්වයේ මූලික, විවේචනාත්මක අංගයක් eval
පවතින පිළිතුරු වල අඩංගු නොවන බව ඔබ විශ්වාස කරනවාද ? එසේ නම්, එය පැහැදිලි කර ඔබේ පැහැදිලි කිරීම නිදර්ශනය කිරීමට උදාහරණය භාවිතා කරන්න. කරුණාකර අදහස් දැක්වීමේදී ප්රතිචාර නොදක්වන්න; ඔබේ පිළිතුර වඩාත් පැහැදිලි සහ සම්පූර්ණ කිරීමට සංස්කරණය කරන්න.
type command
කුමක්දැයි දැන ගැනීමට භාවිතා කරන්න . (type eval