Bash脚本重定向标准错误后如何显示read命令的提示符?
解决Bash中重定向stderr后read -p提示符消失的问题
问题原因
read -p的提示文本默认输出到标准错误(stderr)。你用exec 2> >(sed $'s,.*,\e[38;5;9;82m&\e[m,'>&1)把stderr重定向到sed处理时,sed默认是行缓冲模式——只有遇到换行符才会输出内容,但read -p的提示符没有换行,导致sed一直缓冲内容不输出,所以你看不到提示符。
解决方案
方法1:给sed添加无缓冲选项(最简洁)
GNU sed支持-u(或--unbuffered)选项关闭行缓冲,让sed处理完内容立刻输出,不管有没有换行。修改你的exec命令:
exec 2> >(sed -u $'s,.*,\e[38;5;9;82m&\e[m,'>&1)
修改后,read -p的提示符会被sed立刻处理并输出,且保持你设置的红色样式。
方法2:手动输出提示符并刷新缓冲区
如果不想修改sed配置,可以自己用echo输出带颜色的提示符到stderr,再调用不带-p的read:
# 直接输出红色提示符到stderr echo -e "\e[38;5;9;82m请输入一个字符: \e[m" >&2 read -n 1 -r
或者保留read -p,手动强制刷新stderr缓冲区:
read -p $'\e[38;5;9;82m请输入一个字符: \e[m' -n 1 -r >&2 echo -n "" # 强制刷新stderr,让提示符立刻显示
测试脚本
可以用下面的脚本验证效果:
#!/bin/bash exec 2> >(sed -u $'s,.*,\e[38;5;9;82m&\e[m,'>&1) echo "这是标准输出(默认颜色)" echo "这是标准错误(红色)" >&2 # 测试read -p的提示符 read -p "请输入一个字符: " -n 1 -r echo -e "\n你输入的字符是: $REPLY"
内容的提问来源于stack exchange,提问作者Joerg Peter
相关产品推荐
相关产品推荐

