如何在不分支子shell的情况下获得shell函数的输出?

bal*_*lki 11 bash shell zsh

我有以下功能.

hello () {
        echo "Hello"
}
func () {
        hello
        echo "world"
}
Run Code Online (Sandbox Code Playgroud)

如果我不希望打印hello函数的输出但想要对它做一些事情,我想在某个变量中捕获输出,唯一可能的方法是分叉子shell,如下所示?这不是一个不必要的新子进程创建吗?这可以优化吗?

func () {
        local Var=$(hello)
        echo "${Var/e/E} world"
}
Run Code Online (Sandbox Code Playgroud)

Ide*_*lic 5

一个丑陋的解决方案是临时替换,echo以便它设置一个全局变量,您可以从函数中访问该变量:

func () {
  echo () {
    result="$@"
  }
  result=
  hello
  unset -f echo
  echo "Result is $result"
}
Run Code Online (Sandbox Code Playgroud)

我同意这很令人讨厌,但避免使用 subshel​​l。