已用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
相关产品推荐
相关产品推荐

