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

如何将Linux Bash命令行输入/输出记录至文本文件?含Python脚本方案

记录Linux Bash输入输出的两种实现方案

嘿,这个需求我太熟了!不管是想记录整个命令行会话,还是单个命令的输入输出,都有靠谱的办法,分Bash原生工具和Python脚本两种场景给你讲清楚:

一、Bash 原生命令行记录方法

1. 用 script 记录完整会话

这是最直接的方式,专门用来捕获整个命令行交互过程的输入和输出:

  • 启动记录:直接在终端输入 script my_session.log,之后你在终端的所有操作(输入的命令、输出的结果)都会自动写入 my_session.log 文件
  • 停止记录:按下 Ctrl+D 或者输入 exit 即可结束会话,记录自动保存
  • 进阶用法:
    • 追加模式:如果不想覆盖已有日志,用 script -a my_session.log,新的会话内容会追加到文件末尾
    • 记录时间戳:加上 -t 参数可以把每个操作的时间戳单独存到另一个文件,比如 script -t 2>timestamps.log my_session.log,之后用 scriptreplay timestamps.log my_session.log 还能回放整个会话

2. 重定向单个命令的输出

如果只是想记录某一个命令的结果,不用完整会话,可以用重定向:

  • 只记录标准输出:ls -l > output.log(会覆盖原有文件)
  • 同时记录标准输出和错误:ls -l &> output.log 或者 ls -l 2>&1 > output.log
  • 同时在屏幕显示并写入文件:用 tee 命令,比如 ls -l | tee output.log,追加模式加 -a 参数:ls -l | tee -a output.log

二、Python 脚本实现方案

如果需要更灵活的控制(比如自定义记录格式、结合其他逻辑),可以用Python脚本实现:

1. 记录单个外部命令的输入输出

用 subprocess 模块捕获命令的执行结果,然后写入文件:

import subprocess

# 定义要执行的命令
target_cmd = "ls -l /home"
# 执行命令并捕获输出和错误信息
cmd_result = subprocess.run(
    target_cmd,
    shell=True,
    capture_output=True,
    text=True  # 让输出以字符串形式返回,而非字节
)

# 将结果写入日志文件
with open("single_cmd_log.log", "w", encoding="utf-8") as log_f:
    log_f.write(f"执行命令: {target_cmd}\n\n")
    log_f.write("命令输出:\n")
    log_f.write(cmd_result.stdout)
    if cmd_result.stderr:
        log_f.write("\n命令错误信息:\n")
        log_f.write(cmd_result.stderr)

print("命令执行结果已保存到 single_cmd_log.log")

2. 模拟交互式命令行并记录会话

这个脚本可以实现类似 script 命令的功能,同时支持自定义日志格式:

import subprocess
import sys

# 日志文件路径
session_log = "python_session.log"

# 启动bash交互式进程
bash_process = subprocess.Popen(
    ["bash"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,  # 将错误输出合并到标准输出
    text=True,
    bufsize=1,
    universal_newlines=True
)

print("=== 交互式会话已启动,输入'exit'结束 ===")
with open(session_log, "a", encoding="utf-8") as log_f:
    while True:
        # 获取用户输入的命令
        user_input = input("$ ")
        # 输入exit则退出会话
        if user_input.strip() == "exit":
            bash_process.stdin.write("exit\n")
            bash_process.stdin.flush()
            break
        # 将用户输入写入日志
        log_f.write(f"[输入] $ {user_input}\n")
        # 把命令发送给bash进程
        bash_process.stdin.write(f"{user_input}\n")
        bash_process.stdin.flush()
        # 读取命令执行的输出
        output_lines = []
        while True:
            line = bash_process.stdout.readline()
            if not line:
                break
            output_lines.append(line)
        output_content = "".join(output_lines)
        # 在终端显示输出
        print(output_content, end="")
        # 将输出写入日志
        log_f.write(f"[输出]\n{output_content}\n")

# 等待bash进程结束
bash_process.wait()
print(f"\n=== 会话结束,日志已保存到 {session_log} ===")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:25