推荐用 $() 捕获函数 stdout:result=$(myfunc),仅捕获 stdout(不包括 stderr),支持多行、保留换行,比反引号更安全易嵌套;函数需显式输出(如 echo),否则变量为空。

直接用命令替换语法就能把函数的标准输出存进变量,不涉及 stderr,也不需要额外启动子 shell。
用 $() 捕获函数输出
这是最推荐的方式。定义好函数后,用 $(函数名) 获取它的 stdout:
- 函数必须有显式输出,比如
echo、printf或命令本身产生 stdout - 函数内不能只靠副作用(如修改全局变量)而不打印内容,否则变量会为空
- 示例:
myfunc() { echo "hello world"; }
result=$(myfunc)
echo "$result" # 输出:hello world
```
注意标准错误不会被捕获
$() 只截获 stdout(文件描述符 1),stderr(文件描述符 2)仍会直接打印到终端:
- 如果函数里有
echo "error" >&2,这条信息会照常显示,但不会进变量 - 如需同时捕获 stdout 和 stderr,可重定向:
result=$(myfunc 2>&1)
避免用反引号(`)
虽然 result=`myfunc` 也能工作,但存在明显限制:
- 嵌套困难,比如
`echo $(date)`会报错 - 对反斜杠、引号等特殊字符处理更脆弱
- 现代脚本统一用
$()更安全、可读、可维护
函数内含多行输出也没问题
$() 会完整保留换行符,赋值后可用 printf '%s' "$result" 或 echo "$result" 原样输出:
- 若需去除首尾空白或合并成一行,再额外用
tr、xargs等处理 - 变量本身不自动裁剪,行为和命令行执行结果完全一致











