如何修改bashrc实现仅记录bash中最后一条命令及其输出?
实现Bash仅记录最后一条命令的输出到日志文件
可以通过修改~/.bashrc实现这个需求,核心是利用Bash的trap陷阱和PROMPT_COMMAND机制,替代你之前的全局重定向配置,确保日志始终只保留最后一条命令的输出:
配置步骤
在~/.bashrc末尾添加以下代码:
# 定义最后一条命令输出的日志文件路径 LAST_CMD_LOG="$HOME/.last_command_output.log" # 保存原始的标准输出和错误输出(避免丢失终端输出能力) exec 3>&1 4>&2 # DEBUG陷阱:每条命令执行前,将输出重定向到日志(覆盖模式) trap 'exec > >(tee "$LAST_CMD_LOG") 2>&1' DEBUG # PROMPT_COMMAND:命令执行完成后,恢复终端的标准输出和错误输出 PROMPT_COMMAND='exec >&3 2>&4'
配置说明
exec 3>&1 4>&2:先把当前终端的标准输出(文件描述符1)和错误输出(文件描述符2)分别保存到文件描述符3和4,后续恢复输出时会用到。trap '...' DEBUG:DEBUG陷阱会在每条命令执行前触发,此时将输出重定向到tee命令,tee会直接覆盖日志文件(无-a参数),同时把内容输出到终端,保证你能实时看到命令输出。PROMPT_COMMAND='...':该命令会在每条命令执行完成后触发,把标准输出和错误输出恢复到之前保存的终端状态,避免后续操作的输出一直被重定向到日志。
优化:排除交互式命令
如果执行如vim、nano这类交互式命令时出现终端显示异常,可以修改trap逻辑,排除指定命令:
trap ' # 排除交互式命令,避免终端显示异常 if [[ "$BASH_COMMAND" != "vim" && "$BASH_COMMAND" != "nano" && "$BASH_COMMAND" != "less" ]]; then exec > >(tee "$LAST_CMD_LOG") 2>&1 fi ' DEBUG
配置完成后,执行source ~/.bashrc使配置生效。之后每次执行命令的输出都会覆盖日志文件,机器重启后查看~/.last_command_output.log就能获取最后一次执行的命令输出。
内容的提问来源于stack exchange,提问作者sunilsurana
相关产品推荐
相关产品推荐

