在包含定义函数的命令的字符串上使用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)
为什么这不起作用?
这是因为你的管道之后产生了一个子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)