在 中eval <command>
,如何eval
评估以下命令?
是否eval
创建一个 shell 子进程来评估<command>
?
如果不是,是否eval
依赖当前的shell进程来评估它?
注意
eval
是一个内置进程,因此没有为eval
自己创建子进程。<command>
,可能会或可能不会创建一个子进程来运行它,具体取决于是否<command>
是内置进程。用于评估上述命令的 shell 子进程不是注释中提到的两个中的任何一个。
谢谢。
有效的做法eval
是解析参数、扩展变量等,然后正常执行生成的字符串。
因此,例如:
$ i=ls
$ eval $i
Run Code Online (Sandbox Code Playgroud)
这里eval
将替换$i
为ls
,然后正常运行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 中完成的;该字符串的结果可能会也可能不会创建新进程,与任何其他命令相同。