Bash脚本调用函数后echo无法输出至stdout的解决咨询
问题原因
你使用的count="$(foo)"是Bash的命令替换语法,它会将foo函数中所有输出到**标准输出(stdout)**的内容全部捕获,并存入count变量中。这就导致foo里的echo 1和返回字符串都被"收进"变量,没有显示在终端;而主函数的echo 0直接输出到stdout,所以能正常打印。
解决方案
根据不同需求,提供三种处理方式:
1. 部分内容输出终端,部分作为返回值
如果只想让foo里的特定内容显示在终端,另一部分作为返回值存入变量,可以把要显示的内容输出到标准错误(stderr)——命令替换只会捕获stdout,stderr的内容会直接显示:
#!/bin/bash foo() { echo 1 >&2 # 输出到stderr,直接显示在终端 echo "I want to return this string" # 被命令替换捕获到count } main() { echo 0 count="$(foo)" # 可选:查看捕获到的返回值 # echo "捕获的返回内容:$count" } main "$@"
运行结果:
0 1
2. 所有内容直接输出终端
如果不需要捕获foo的返回值,直接调用函数即可,所有echo都会输出到stdout:
#!/bin/bash foo() { echo 1 echo "I want to return this string" } main() { echo 0 foo # 直接调用,无命令替换 } main "$@"
运行结果:
0 1 I want to return this string
3. 同时捕获返回值并输出内容
如果既要把foo的返回值存入变量,又要让函数里的内容显示在终端,可以先保存当前stdout到临时文件描述符,在foo中指定输出到该描述符:
#!/bin/bash foo() { echo 1 >&3 # 输出到保存的终端stdout echo "I want to return this string" # 被命令替换捕获 } main() { echo 0 exec 3>&1 # 将当前终端的stdout保存到文件描述符3 count="$(foo)" # 捕获返回值到count exec 3>&- # 关闭临时描述符 echo "捕获的返回值:$count" } main "$@"
运行结果:
0 1 捕获的返回值:I want to return this string
内容的提问来源于stack exchange,提问作者WesternGun
相关产品推荐
相关产品推荐

