eval是通过创建一个shell进程来评估以下命令来实现的吗?

Tim*_*Tim 0 bash eval

在 中eval <command>,如何eval评估以下命令?

  • 是否eval创建一个 shell 子进程来评估<command>

  • 如果不是,是否eval依赖当前的shell进程来评估它?

注意

  • eval是一个内置进程,因此没有为eval自己创建子进程。
  • 在执行之前<command>,可能会或可能不会创建一个子进程来运行它,具体取决于是否<command>是内置进程。

用于评估上述命令的 shell 子进程不是注释中提到的两个中的任何一个。

谢谢。

Ste*_*ris 5

有效的做法eval是解析参数、扩展变量等,然后正常执行生成的字符串。

因此,例如:

$ i=ls
$ eval $i
Run Code Online (Sandbox Code Playgroud)

这里eval将替换$ils然后正常运行ls命令(因此它将fork()/exec()运行该ls进程)。

然而如果你这么做了

$ i="echo hello"
$ eval $i
hello
Run Code Online (Sandbox Code Playgroud)

那么不会创建新进程,因为它echo hello是作为内置进程运行的。

通过设置变量我们可以看到没有创建shell:

$ a=0
$ i="a=100"
$ eval $i
$ echo $a
100
Run Code Online (Sandbox Code Playgroud)

$a如果在当前 shell 中完成,则只能设置为 100。

所以它eval本身实际上只是一个解析器,并且是在当前 shell 中完成的;该字符串的结果可能会也可能不会创建新进程,与任何其他命令相同。