Shell 快照 — reference/06-bash-engine.md 问题: 每次执行命令都用 sh -l 启动,会重新加载 .bashrc/.zshrc, 这很慢(可能 200ms+),而且可能导致副作用。 解决方案: 第一次命令前,捕获整个 shell 环境到一个临时文件, 后续命令 source 这个文件而不是做完整的登录初始化。
()
| 563 | # 理解它们对设计自己的系统很有价值。 |
| 564 | |
| 565 | def demonstrate_shell_snapshot(): |
| 566 | """Shell 快照 — reference/06-bash-engine.md |
| 567 | |
| 568 | 问题: 每次执行命令都用 sh -l 启动,会重新加载 .bashrc/.zshrc, |
| 569 | 这很慢(可能 200ms+),而且可能导致副作用。 |
| 570 | |
| 571 | 解决方案: 第一次命令前,捕获整个 shell 环境到一个临时文件, |
| 572 | 后续命令 source 这个文件而不是做完整的登录初始化。 |
| 573 | """ |
| 574 | print("\n=== Shell 快照机制 ===") |
| 575 | |
| 576 | # 第一步: 捕获当前 shell 的完整环境 |
| 577 | snapshot_path = tempfile.mktemp(suffix=".sh") |
| 578 | |
| 579 | # 捕获: PATH, 别名, 函数, 导出变量 |
| 580 | # 真实实现中会执行: env; alias; declare -f |
| 581 | snapshot_content = f""" |
| 582 | # Shell 快照 — 自动生成,不要手动编辑 |
| 583 | export PATH="{os.environ.get('PATH', '')}" |
| 584 | export HOME="{os.environ.get('HOME', '')}" |
| 585 | # alias ll='ls -la' # 用户的别名也会被捕获 |
| 586 | """ |
| 587 | with open(snapshot_path, "w") as f: |
| 588 | f.write(snapshot_content) |
| 589 | |
| 590 | print(f"快照保存到: {snapshot_path}") |
| 591 | |
| 592 | # 第二步: 后续命令用 source 快照而不是 sh -l |
| 593 | # 不用 -l 就不会重新加载 .bashrc,快很多 |
| 594 | actual_command = "echo hello" |
| 595 | wrapped = f"source {snapshot_path} 2>/dev/null || true && eval '{actual_command}'" |
| 596 | print(f"包装后的命令: {wrapped}") |
| 597 | |
| 598 | # 清理 |
| 599 | os.unlink(snapshot_path) |
| 600 | |
| 601 | return wrapped |
| 602 | |
| 603 | |
| 604 | def demonstrate_cwd_tracking(): |
no test coverage detected