为什么`eval`不在我的循环中工作?

Sta*_*ked 1 bash

在包含定义函数的命令的字符串上使用eval可以正常工作:

$ eval "p4() { echo 4; }"
$ p4
4
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时它不再起作用:

$ echo 'p3() { echo 3; }' | while read line ; do eval "$line"; done
$ p3
-bash: p3: command not found
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

anu*_*ava 8

这是因为你的管道之后产生了一个子shell echo.这是p3在子shell中声明函数,无法从当前(父)shell访问.

您可以使用here-string而不是管道来避免它:

while read line ; do eval "$line"; done <<< 'p3() { echo 3; }'

p3
3
Run Code Online (Sandbox Code Playgroud)