Shell脚本终端实时文本显示异常:echo命令无法即时输出
问题原因
当你用src_port=$(get_src_port)调用函数时,$(...)会**捕获函数所有标准输出(stdout)**并赋值给变量,所以函数里的echo输出都被存到src_port里了,不会实时显示在终端。而gum命令的内容能显示,是因为它默认直接输出到终端的控制终端(tty),没走标准输出通道,所以没被捕获。
解决办法
把需要实时显示的提示信息输出到标准错误(stderr),这样就不会被$(...)捕获,会直接打印到终端。修改方式很简单,在echo后面加>&2即可。
修改后的函数代码:
get_src_port() { port=10000 echo "use default port ?" >&2 # 输出到stderr,实时显示 answer=$(gum choose "$YES" "$NO") # 补上捕获gum的输出到answer,原代码漏写此步 if [ "$answer" = "NO" ]; then # 匹配$YES/$NO的大小写,原代码逻辑会因变量为空失效 port=$(gum input --placeholder "Enter the port and press [ENTER]: ") fi echo $port # 输出到stdout,会被$(...)捕获到变量中 }
调用方式保持不变:
src_port=$(get_src_port)
现在函数里的提示信息会实时显示,最终的端口值也能被正确捕获到src_port变量中。
内容的提问来源于stack exchange,提问作者jeremie legrand
相关产品推荐
相关产品推荐

