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
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↩︎