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

已用tee捕获Bash会话,执行bash命令时终端无响应如何解决?

问题原因

你遇到的终端无响应是因为子shell继承了父shell的输出重定向设置:父shell通过exec > >(tee ...)把标准输出和错误都重定向到tee进程,当你执行bash启动子shell时,子shell的输出也会被送到这个tee管道,但tee的管道无法正确处理子shell的交互输入输出,导致终端阻塞。

解决方案

1. 临时启动无重定向的子shell

直接执行以下命令,让子shell的输入输出直接绑定到终端:

bash >/dev/tty 2>&1

2. 修改bashrc的日志代码,避免子shell继承

在bashrc里添加条件判断,只让最外层的交互式shell启用日志:

# 仅在交互式、非子shell中开启会话日志
if [[ $- == *i* ]] && [[ $SHLVL -eq 1 ]]; then
    exec > >(tee -a ~/.bash_command_log) 2>&1
fi

$SHLVL记录了shell嵌套层级,值为1表示是最外层shell,子shell的$SHLVL会大于1,这样就不会继承重定向。

3. 改用script命令记录会话(更可靠)

script是专门用于捕获终端会话的工具,比手动重定向更稳定,不会出现子shell阻塞问题。修改bashrc如下:

if [[ $- == *i* ]] && [[ -z $SCRIPT_SESSION ]]; then
    export SCRIPT_SESSION=1
    # -a 表示追加模式记录日志
    script -a ~/.bash_command_log
    exit
fi

这样每次启动交互式shell都会自动启动script记录会话,子shell不受影响,退出子shell也不会中断父会话的日志记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:12:03