Bash 函数是否可以将值输出到文件描述符,然后仅将其分配给变量?

Is it possible for a Bash function, to output a value to a file descriptor, and assign only that to a variable?

我想为 Bash 函数模拟一个 return 值,我想知道是否可以使用临时文件描述符来传递该值。

换句话说:

function myfunction {
  # print `stdout_value` to stdout
  # print `stderr_value` to stderr
  # print `return_value` to FD3 (or other)
}

# the values printed to stderr/stdout should be printed, but only
# `return_value` should be assigned to `myvalue`
myvalue=$(myfunction <FDs manipulation>)

是的。但是为了让它起作用,首先你需要将 stdout 保存到另一个描述符以用于整个调用和命令替换;将文件描述符 3 重定向到它的 stdout——以便可以捕获写入它的内容——并将它的 stdout 重定向到整个调用的 stdout。例如:

{ myvalue=$(myfunction 3>&1 1>&4); } 4>&1

尽管每次调用该函数都执行此操作听起来工作量很大。您最好遵循以下约定:

  • 使用 stderr 报告错误、警告和调试信息(包括日志和提示),
  • 使用 stdout 显示结果,
  • 并使用 return 语句表示整体 success/failure。

首先创建标准输出的全局副本可能是最简单的方法。例如:

#!/bin/sh

exec 4>&1
myfunction() {
        echo stdout
        echo stderr >&2
        echo fd3 >&3
} 3>&1 1>&4


v=$(myfunction)   # assigns the string "fd3"
echo v="$v"