Фактически eval
анализирует аргументы, раскрывает переменные и т. Д., А затем результирующая строка выполняется как обычно.
Так, например:
$ i=ls
$ eval $i
eval
здесь заменит $ i
на ls
и , затем запустит ] ls
как обычно (так что для запуска процесса ls
будет fork ()
/ exec ()
).
Если, однако, вы сделали
$ i="echo hello"
$ eval $i
hello
, то новый процесс не создается, потому что echo hello
выполняется как встроенная функция.
Мы видим, что оболочка не создается путем установки переменных:
$ a=0
$ i="a=100"
$ eval $i
$ echo $a
100
$ a
может быть установлено в 100, только если это было сделано в текущей оболочке.
Итак, eval
на самом деле является просто синтаксическим анализатором и выполняется в текущей оболочке; результаты этой строки могут создавать или не создавать новый процесс, как и любая другая команда.