Mac Terminal粘贴被截断问题解决手册
前一阵自己mac的rz和sz无法使用了, 以为是系统升级或者别的哪里的问题, 因为不是太影响使用, 就没当回事. 今天需要通过terminal粘贴的时候出现被截断的问题, 因此排查一下问题故障原因, 记录一下.
故障情况
上面的这个gif说明了情况, 就是粘贴不全, 数据被截断
排查过程
换用其他账号测试
临时创建一个用户, 切换到新用户尝试, 一切正常, 排除系统App故障问题
换用其他Terminal客户端
我依次使用了以下的客户端, 有的有问题, 有的没问题
| 客户端 | 是否正常 | 备注 |
|---|---|---|
| Terminal.app(原生终端模拟器) | ❌ | Apple自带终端模拟器, 丑的1P |
| Tabby(Eugeny/tabby: A terminal for a more modern age) | ❌ | Github上开源的现代化终端模拟器 |
| WindTerm(kingToolbox/WindTerm: A professional cross-platform SSH/Sftp/Shell/Telnet/Serial terminal.) | ⭕ | Github上开源的多平台(Win/Mac/Linux)终端模拟器 |
| SecureCRT(SecureCRT - The rock-solid Telnet and SSH client for Windows, Mac, and Linux) | ⭕ | 老牌的多平台终端模拟器 |
| iTerm2(iTerm2 - macOS Terminal Replacement) | ❌ | 原生Terminal的免费最佳平替 |
从结果来看, 有可以有失败,
SecureCRT和WindTerm是正常的,
但是其他三个都不正常, 原因是啥? 核心终端模拟器不同!
这个虽然我并没有进一步研究探索,
但是能成功的都是多平台支持的,
那么如果要开发多平台支持的app,
那他核心的部分一定是要相同的或者说至少接口要一致,
否则多个平台多套API这个明显就是天坑. 所以猜测,
因为成功的两个没有使用Mac系统自带的终端模拟器,
且有可能并未完全加载用户环境变量, 因此没有受到影响.
检查环境变量
按照上一步的猜测, 找来了同事的电脑, 两边都执行env,
放到一起对比, 并未发现明显异常点
尝试搜索
1 | # Fig pre block. Keep at the top of this file. |
观察下已粘贴的内容, 我计算了一下字符数量, 为1016, 因此就搜索了一下, 是否有可能因为环境变量之类的影响到粘贴限制
上面的例子给了我一些启发, 可能是stty导致的?
检查stty情况
关于stty, 以下是一些有用的链接
What is stty ? | difyel - linux /usr/
stty — Set or display terminal options - IBM Documentation
How to Use Linux Stty Command?
简短来说, tty = teletype, 这个是计算机早期时候作为用户与计算机交互使用的, 而stty = Set Teletype是用于改变tty模式/速率等等设置
通过对比两个stty信息, 明显可以发现最大的区别就是速率的不同, 想到这里,
可以猜测到可能由于用户家目录下的如.zshrc/.profile等等在进入shell之前的脚本导致的
关于stty速率
devices - set baud speed for tty - Unix & Linux Stack Exchange
排查$HOME/.xxx文件
考虑到我的用户家目录下,以.(dot)开头的隐藏文件比较多,
因此, 为了验证问题是否出在这里, 我直接执行了以下
1 | # 创建备份目录 |
然后使用iTerm2重新启动了一个新window, 验证发现使用正常, 问题原因就在这了!
梳理一下目录下的隐藏文件情况:
| 文件 | 用途 | 备注 |
|---|---|---|
| .bash_history | Bash的历史记录 | 肯定无影响, 该文件只写不读 |
| .bash_profile | Bash初始化后执行的脚本 | 肯定无影响, 该文件不会影响到Zsh使用 |
| .bashrc | Bash初始化后执行的脚本 | 肯定无影响, 该文件不会影响到Zsh使用 |
| .chowrex.zsh | 我个人额外定义的启动脚本 | 肯定无影响, 该文件只添加了一些alias信息 |
| .config | 应用配置目录 | 肯定无影响, 检查了一下, 只包含应用配置 ![]() |
| .fig | Fig文件的配置目录Fig | 存在影响的可能性 |
| .fig.dotfiles.bak | Fig文件的备份目录 | 大概率无影响, 从名称上看是个备份目录 |
| .iterm2 | iTerm2的配置相关内容 | 大概率无影响, 因为不可能影响到其他app正常使用 |
| .iterm2_shell_integration.zsh | iTerm2的智能补全相关内容 | 大概率无影响, 因为不可能影响到其他app正常使用 |
| .oh-my-zsh | OhMyZsh的程序目录 | 存在影响的可能性 |
| .p10k.zsh | PowerLevel10K命令行美化初始脚本romkatv/powerlevel10k: A Zsh theme | 存在影响的可能性 |
| .ssh | SSH命令的相关配置与私钥等存储 | 肯定无影响, 该文件只影响到SSH连接 |
| .zprofile | Zsh初始化后执行的脚本 | 存在影响的可能性 |
| .zsh_history | Zsh的历史记录 | 肯定无影响, 该文件只写不读 |
| .zsh_sessions | Zsh的会话信息 | 猜测无影响 |
| .zshrc | Zsh初始化后执行的脚本Zshrc File Explained in 10 Easy to Understand Points - Tools Pond | 存在影响的可能性 |
| .zshrc.pre-oh-my-zsh | Zsh安装OhMyZsh后的前处理脚本 | 存在影响的可能性 |
找到元凶
经过几次不断的移回隐藏文件/目录并测试是否正常,
最终问题定位在了.fig这个目录, 关于fig, 见下图
Fig其实是一个智能自动补全的工具, 支持500+主流CLI工具, 我一直在用,
很顺手, 万万没想到这个浓眉大眼的家伙也叛变了
最终定位到,
影响到这个变化的是~/.fig/bin/zsh (figterm)这个应用
执行了这个所谓layer的文件后, 编辑就出问题, 把他移除后, 一切正常!
结论
造成本次问题出现的主要原因是Fig应用更新导致添加了一个中间层的应用,
该应用会将复制粘贴的内容截断, 并且影响lrzsz应用正常使用.
将中间层文件移除后故障得以解决.
后续
我又测试了一下修改stty的速率信息, 但是实际确实不影响复制粘贴的使用, 也不会产生截断情况, 见下方gif
那么下面的问题就无法排查了, 这个二进制文件我就无能为力, 去Github上反馈一下bug1, 后续跟踪一下进度
