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

Bash脚本如何重定向Stderr和Stdout到文件同时保留终端Stdin输入?

Bash脚本重定向stdout/stderr到文件同时保留终端交互

问题原因

你用./test.sh &> logs运行脚本时,&>会同时重定向**标准输出(stdout)和标准错误(stderr)**到日志文件,而read -p的提示信息是输出到stdout的,所以提示被写入了日志文件,无法在终端看到;虽然stdin默认关联终端,但因提示不可见,导致你无法感知输入需求。

解决方案

方案一:脚本内部全局重定向,单独处理交互

修改脚本,将后续所有stdout/stderr默认定向到日志,同时强制read的交互走终端设备/dev/tty,运行时直接执行./test.sh即可,无需额外重定向参数:

#!/bin/bash

# 全局重定向:后续所有stdout和stderr写入logs文件
exec &> logs

# 强制从终端读取输入,提示信息输出到终端
read -p "Enter 1 or 0 " var </dev/tty >/dev/tty

echo "hello"

# 无需再手动加>> logs,全局重定向已生效
bash <<EOF
    echo "testing"
    error
EOF

方案二:保留运行时重定向,单独处理提示输出

如果必须用./test.sh &> logs的方式运行,拆分read -p为单独的提示输出和输入读取,强制走终端设备:

#!/bin/bash

# 手动输出提示到终端
echo -n "Enter 1 or 0 " >/dev/tty
# 从终端读取输入
read var </dev/tty

echo "hello"

bash <<EOF >> logs
    echo "testing"
    error
EOF

方案说明

  • /dev/tty是当前进程关联的终端设备文件,直接读写它可以绕过已被重定向的标准文件描述符,确保交互和终端直接通信。
  • 方案一的优势是把重定向逻辑封装在脚本内,用户操作更简洁;方案二则适合必须保留外部重定向参数的场景。

内容的提问来源于stack exchange,提问作者codebee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:17