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的免费最佳平替

从结果来看, 有可以有失败, SecureCRTWindTerm是正常的, 但是其他三个都不正常, 原因是啥? 核心终端模拟器不同! 这个虽然我并没有进一步研究探索, 但是能成功的都是多平台支持的, 那么如果要开发多平台支持的app, 那他核心的部分一定是要相同的或者说至少接口要一致, 否则多个平台多套API这个明显就是天坑. 所以猜测, 因为成功的两个没有使用Mac系统自带的终端模拟器, 且有可能并未完全加载用户环境变量, 因此没有受到影响.

检查环境变量

按照上一步的猜测, 找来了同事的电脑, 两边都执行env, 放到一起对比, 并未发现明显异常点

尝试搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Fig pre block. Keep at the top of this file.
[[ -f "$HOME/.fig/shell/zshrc.pre.zsh" ]] && . "$HOME/.fig/shell/zshrc.pre.zsh"
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH="/Users/zrx/.oh-my-zsh"

# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes

# ZSH_THEME="robbyrussell"
ZSH_THEME="powerlevel1

观察下已粘贴的内容, 我计算了一下字符数量, 为1016, 因此就搜索了一下, 是否有可能因为环境变量之类的影响到粘贴限制

Terminal does not accept pasted or typed lines of more than 1024 characters - Unix & Linux Stack Exchange

上面的例子给了我一些启发, 可能是stty导致的?

检查stty情况

关于stty, 以下是一些有用的链接

What is stty ? | difyel - linux /usr/

stty — Set or display terminal options - IBM Documentation

stty(1) - Linux manual page

How to Use Linux Stty Command?

简短来说, tty = teletype, 这个是计算机早期时候作为用户与计算机交互使用的, 而stty = Set Teletype是用于改变tty模式/速率等等设置

我的mac的stty信息
同事的信息(后补充的,数据一致)

通过对比两个stty信息, 明显可以发现最大的区别就是速率的不同, 想到这里, 可以猜测到可能由于用户家目录下的如.zshrc/.profile等等在进入shell之前的脚本导致的

关于stty速率

devices - set baud speed for tty - Unix & Linux Stack Exchange

How to use stty to set serial port speed

Special (GNU Coreutils 9.1)

Serial HOWTO: Speed (Flow Rate)

排查$HOME/.xxx文件

考虑到我的用户家目录下,以.(dot)开头的隐藏文件比较多, 因此, 为了验证问题是否出在这里, 我直接执行了以下

1
2
3
4
5
# 创建备份目录
mkdir -p $HOME/bak

# 移动所有隐藏文件到备份目录
mv $HOME/.* $HOME/bak

然后使用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官网介绍

Fig其实是一个智能自动补全的工具, 支持500+主流CLI工具, 我一直在用, 很顺手, 万万没想到这个浓眉大眼的家伙也叛变了

暴露年龄

最终定位到, 影响到这个变化的是~/.fig/bin/zsh (figterm)这个应用

这个应用影响了正常使用
查看应用说明

执行了这个所谓layer的文件后, 编辑就出问题, 把他移除后, 一切正常!

结论

造成本次问题出现的主要原因是Fig应用更新导致添加了一个中间层的应用, 该应用会将复制粘贴的内容截断, 并且影响lrzsz应用正常使用. 将中间层文件移除后故障得以解决.

后续

我又测试了一下修改stty的速率信息, 但是实际确实不影响复制粘贴的使用, 也不会产生截断情况, 见下方gif

修改速率不会影响复制粘贴

那么下面的问题就无法排查了, 这个二进制文件我就无能为力, 去Github上反馈一下bug1, 后续跟踪一下进度


  1. Fig's layer truncate the paste values · Issue #1730 · withfig/fig↩︎