命令行剪贴板访问和替代方案
1. 简介
缓冲区存在于每个计算级别。它们临时存储数据以供将来操作。剪贴板就是这样的缓冲区。在本文中,我们将解释在 Linux 下从终端使用剪贴板的方法。为此,我们将讨论剪贴板实现和终端。
本文中的代码已经在 Debian 10.10 (Buster) 和 GNU Bash 5.0.3 上进行了测试。它是 POSIX 兼容的,应该可以在任何这样的环境中工作。
2. 剪贴板
剪贴板与其他缓冲区的区别在于它们的易用性和普遍性。 剪贴板是每个主要操作系统的一部分。它们允许在应用程序中和应用程序之间传输数据。默认(通常是通用的)键盘快捷键和鼠标手势简化了这个过程。
2.1. 系统范围的剪贴板
**系统范围的剪贴板(或系统剪贴板)可在所有应用程序中访问。**特别是X Window System ,通过其X Server组件,在 Linux 中提供系统剪贴板。它包含三个部分(或选择):PRIMARY、SECONDARY和CLIPBOARD。CLIPBOARD通常的功能类似于我们大多数人所说的“剪贴板”。
重要的是,系统剪贴板不是 Linux 内核的一部分。 X Server为 Linux 下的应用程序提供了标准的系统剪贴板。
2.2. 独立剪贴板
独立的剪贴板服务于特定的应用程序,并且不跨越应用程序边界。此外,独立剪贴板可以利用、覆盖或忽略系统剪贴板内容。任何应用程序都可以实现自己独立的剪贴板机制。
因此,独立剪贴板在纯文本终端中特别有价值。我们将在下面讨论它们。
3. 终端
终端是一个命令行界面(CLI) ——它们只接受文本输入。
终端最初只是一个屏幕和键盘。它只有足够的内存来与计算机进行远程通信。Linux 中最接近经典终端的是 Linux 控制台。它完全在内核中实现。因此,Linux 控制台本身不支持系统范围的剪贴板。
经典终端已被终端仿真器取代。它们可以在任何本地或远程机器上运行。终端模拟器可以添加他们正在模拟的终端中不存在的功能。
4. 系统剪贴板CLI访问
标准 CLI 系统剪贴板访问是通过xsel (X 选择)和xclip (X 剪贴板 CLI)完成的。两者都依赖于远程或本地运行的X 服务器。它们的基本用法相似且简单明了:
itcodingman@blogdemo:~$ echo Copied via xsel. | xsel --input
itcodingman@blogdemo:~$ xsel --output
Copied via xsel.
itcodingman@blogdemo:~$ echo Copied via xclip. | xclip -in
itcodingman@blogdemo:~$ xclip -out
Copied via xclip.
尝试在没有运行X 服务器的情况下使用**xsel或xclip(通过xset 检查)会产生错误:
itcodingman@blogdemo:~$ xset q
xset: unable to open display ""
itcodingman@blogdemo:~$ echo Copied via xsel. | xsel --input
xsel: Can't open display: (null)
: Inappropriate ioctl for device
** xsel和xclip等工具是在纯文本终端中使用X Server系统剪贴板的唯一选择**。
另一方面,像GNOME Terminal Emulator 和Konsole 这样的终端仿真器提供了额外的选项。它们的图形用户界面 (GUI) 特性包括本机鼠标,通常还包括键盘支持。因此,用户可以通过系统剪贴板轻松选择、存储和恢复文本。该功能还扩展到远程终端仿真器(例如Putty )。
5.独立剪贴板CLI访问
即使系统剪贴板不可用,也有类似剪贴板功能的选项。
5.1.通用鼠标 ( gpm )
事实证明,终端的“仅文本输入”规则存在漏洞。它可能是通过剪贴板存储和恢复数据的最自然方式——鼠标。 gpm软件包为任何受支持的终端提供了基本的鼠标驱动程序。当运行gpm守护进程时,一个倒置的高亮字符代表鼠标光标。它大致反映了鼠标的移动以及字符矩阵。
itcodingman@blogdemo:~$ echo This is the output of a command.
This is the output of a command. █
itcodingman@blogdemo:~$
gpm包的剪贴板功能仅限于当前可见的数据。用户可以选择文本直接转移到提示位置。此操作后,数据不会存储在任何地方。
5.2. 屏幕管理器 ( screen ) 和终端多路复用器 ( tmux )
终端输入可以包含复杂的代码符号(想想终端代码 和信号 快捷方式)。例如,它们可以更改屏幕上特定位置的光标位置。
screen和tmux等终端多路复用器将这些指令与键绑定 一起使用。它们使用户能够拥有来自不同进程的多个虚拟控制台。虚拟控制台放置在同一终端屏幕的类似窗口的部分中。
** screen和tmux中的每个虚拟控制台都提供了复制粘贴机制**。用户可以滚动浏览窗口的历史,选择文本,并将其存储在粘贴缓冲区中。粘贴缓冲区的内容保存在主终端多路复用器进程中。随后,它们可以在任何窗口中恢复。
5.3. Vi 改进 ( vi )
vi 文本编辑器还允许在应用程序中进行复制和粘贴操作。例如,从普通模式下的vi(通过Esc访问),用户可以:
- yy – 复制(yank)当前行,包括换行符
- p – 将缓冲区中的行粘贴(放置)到当前行之后的文本中
5.4. 自定义实现
任何存储类型都可以用作一种原始剪贴板。
例如,在 Bash 中,我们可以实现一个剪辑文件:
itcodingman@blogdemo:~$ echo Copied via clipfile. > /tmp/clipfile
itcodingman@blogdemo:~$ cat /tmp/clipfile
Copied via clipfile.
然而,缺点包括不方便、缺乏标准化和有用性有限。