同一个文件在两台机器上看起来一样,为什么哈希却不同?让 Codex 帮忙排查时,先把“看起来一样”拆成字节、换行、路径和工具运行位置,才有可验证的目标。
这次用一个只读取指定文件的小工具串起安装、登录、任务描述、代码审阅和结果验证。与此前 CSV、JSONL 教程不同,本例关心文件本身,适合排查下载产物、构建输入和跨系统传输差异。
一、三系统安装、登录与工作目录
本文使用 Codex CLI。以下安装与更新入口于 2026-09-25 对照 OpenAI 官方 CLI 文档 核查;桌面应用和 IDE 扩展不是同一安装流程。
Windows PowerShell:
powershell-ExecutionPolicy ByPass-c"irm https://chatgpt.com/codex/install.ps1 | iex"macOS、Linux 在各自终端执行:
curl-fsSLhttps://chatgpt.com/codex/install.sh|sh独立安装器可用同一命令更新;若已有 npm 或 Homebrew 安装,沿原渠道更新。新开终端执行codex --version,Windows 用Get-Command codex、macOS/Linux 用command -v codex核对实际入口。
进入新建练习目录后执行codex,按界面选择适用的登录方式。会话内用/status查看状态、/permissions核对工作范围,确认工具正在处理哪一份项目。
Windows 原生环境可以作为起点。只有依赖 Linux 工具链、项目已经在 WSL2,或原生沙盒不满足需求时,再选择 WSL;不要把所有故障都归为“Windows 不支持”。依据见 Windows 官方说明。
二、把验收要求写给 Codex
本练习额外需要 Python 3,它是示例程序的依赖。Windows 先检查py -3 --version;macOS/Linux 检查python3 --version。安装了其他 Python 入口时,后面的命令跟随已核实的解释器调整。
在一个新的file-lab目录中启动 Codex,可以给出下面的任务:
实现 file_report.py,只用 Python 标准库。 命令行接收一个或多个明确指定的文件路径,不递归扫描目录。 逐个输出路径、原始字节数、SHA-256、独立 LF、CRLF、独立 CR 数量。 必须按原始字节读取,不做解码、换行转换或内容修复。 保留参数顺序;重复路径按重复参数保留。 成功在 stdout 输出一个 JSON 对象并退出 0。 任一输入失败,在 stderr 说明错误,stdout 不输出部分 JSON,退出 2。 输入只读;拒绝末级符号链接和非普通文件。 先说明当前目录与修改计划,完成后运行正常和失败场景,报告实际结果。这里的“独立 LF”指不属于 CRLF 的 LF 字节,不是文本行数。没有末尾换行的两行文本也可能只有一个 LF。提前把语义写清楚,能避免模型自行选择另一种统计方式。
三、可运行的参考实现
保存为file_report.py。这份程序用于本次离线验证,不是某次 Codex 模型会话的输出记录。
importargparseimporthashlibimportjsonimportsysfrompathlibimportPathdefinspect_file(path):path=Path(path)ifpath.is_symlink()ornotpath.is_file():raiseValueError('expected a regular, non-symlink file')data=path.read_bytes()crlf=data.count(b'\r\n')return{'path':str(path),'bytes':len(data),'sha256':hashlib.sha256(data).hexdigest(),'lf_only':data.count(b'\n')-crlf,'crlf':crlf,'cr_only':data.count(b'\r')-crlf,}defmain(argv=None):parser=argparse.ArgumentParser()parser.add_argument('files',nargs='+',type=Path)args=parser.parse_args(argv)try:rows=[inspect_file(path)forpathinargs.files]except(OSError,ValueError)aserror:print(str(error),file=sys.stderr)return2print(json.dumps({'files':rows},ensure_ascii=True,indent=2))return0if__name__=='__main__':raiseSystemExit(main())read_bytes()保留文件原始字节;SHA-256 计算也直接使用这些字节,参见 Path.read_bytes 和 hashlib。因此 UTF-8 BOM、不同换行都会计入长度和摘要。
JSON 使用 ASCII 转义输出,中文路径可能显示为\uXXXX;读回 JSON 后仍是原路径,不是路径丢失。程序不把文本编码正确与否当作输入条件,二进制文件也能按字节检查。
四、制造一个可手算的跨系统样本
把下面代码保存为make_sample.py,用 Python 创建样本,可避免编辑器默认换行影响实验:
frompathlibimportPath folder=Path('样本 files')folder.mkdir(exist_ok=True)(folder/'LF.txt').write_bytes(b'a\nb\n')(folder/'CRLF.txt').write_bytes(b'a\r\nb\r\n')Windows PowerShell 在练习目录执行:
py-3 make_sample.py py-3 file_report.py"样本 files/LF.txt""样本 files/CRLF.txt"$LASTEXITCODEmacOS/Linux 在各自终端执行:
python3 make_sample.py python3 file_report.py"样本 files/LF.txt""样本 files/CRLF.txt"echo$?路径包含空格时整体加引号。本例路径使用/,交给 Python 的路径处理;不要把C:\...直接当成 Linux 路径使用。WSL 内的解释器和依赖也需要在 WSL 内确认。
预期:LF 文件为 4 字节、独立 LF 为 2;CRLF 文件为 6 字节、CRLF 为 2。两者摘要不同,退出码为 0。长度差来自两个额外的 CR 字节,与模型能力无关。
本轮在 macOS arm64、Python 3.13.13 实际运行得到上述结果;12 个测试方法通过,覆盖已知哈希、空文件、混合换行、无末尾换行、二进制、BOM、中文空格路径、参数顺序、缺失文件、目录、符号链接和无参数。只读检查本机 Codex CLI 为 0.155.1;没有把这个版本称为所有平台的最新版。
五、三系统排障时先定位层次
- Windows:命令找不到先查安装入口和当前 PowerShell;文件找不到先检查工作目录、引号和盘符,不要改算法掩盖路径错误。
- macOS:确认正在使用哪一套 Python,尤其不要把不同终端环境中的解释器混为一谈。
- Linux:核对文件名实际大小写、读权限和挂载位置。相同文件名不代表传输后的字节相同。
- WSL:先决定项目在哪个环境运行,再统一工具、Python 和样本路径;不要一半命令在 Windows、一半在 WSL,却拿两份文件作比较。
交付审阅时,要求 Codex 展示修改文件、实际命令和测试结果。若使用 Git,还要检查新文件和差异,确认没有悄悄修改样本;“测试通过”不替代对测试含义的理解。
六、这个练习的边界
整文件读取不适合超大文件;符号链接检查只针对末级路径,不是抵御路径竞争或目录链接的安全隔离机制。多个文件依次读取也不构成一致性快照。源码没有写入输入,但读文件可能更新文件系统访问时间。生产场景需要另行设计资源限制和并发变更处理。
SHA-256 可以用于检查字节是否与可信摘要相符,本例没有证明文件来源可信,也没有判断业务内容是否正确。先把这些边界讲清楚,Codex 才能围绕实际需求继续开发。
本文使用 AI 辅助整理与编写。实测仅指有记录的本机 Python 程序;没有运行两款工具的模型会话,也没有 Windows/Linux 实机测试。