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"
我想为 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"