Какво можете да направите с командата eval
? Защо е полезна? Това някакъв вид вградена функция в bash ли е? За нея няма страница man
..
eval
е част от POSIX. Това е интерфейс, който може да бъде вграден в шела.
Той е описан в "POSIX Programmer's Manual": http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Тя приема аргумент и конструира от него команда, която ще бъде изпълнена от обвивката. Това е примерът на страницата man:
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'
.Това е често срещана функция в много езици, например в Perl и JavaScript. Погледнете в perldoc eval за повече примери: http://perldoc.perl.org/functions/eval.html
Да, eval
е вътрешна команда на bash и е описана в ръкописната страница на 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.
Обикновено тя се използва в комбинация с Заместване на команда. Без изрична команда eval
шелът се опитва да изпълни резултата от заместването на команда, а не да го оцени.
Да кажем, че искате да кодирате еквивалент на VAR=value; echo $VAR
. Обърнете внимание на разликата в начина, по който шелът обработва записите на echo VAR=value
:
andcoz@...:~> $( echo VAR=value )
bash: VAR=value: командата не е намерена
andcoz@...:~> echo $VAR
<празен ред>
Шелът се опитва да изпълни echo
и VAR=value
като две отделни команди. Тя изхвърля грешка за втория низ. Присвояването остава неефективно.
2.
andcoz@...:~> eval $( echo VAR=value )
andcoz@...:~> echo $VAR
value
Шелът обединява (конкатенира) двата низа echo
и VAR=стойност
, анализира тази единна единица според съответните правила и я изпълнява.
Не на последно място, командата 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
е мощна команда и ако възнамерявате да я използвате, трябва да сте много внимателни, за да избегнете възможните рискове за сигурността, които идват с нея.