You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:48:20