如何在 Linux 的 Bash Shell 中复制和粘贴文本

你是否想在 Bash shell 的命令列中实现复制粘贴? 不管你更习惯用键盘操作还是鼠标操作,这里都有多种方法可以实现。 无论你使用的是图形桌面环境还是传统的文本终端 TTY,这些技巧都能有效。

常规键盘快捷键的局限性

复制和粘贴文本是计算机操作的基础。 初次接触 Linux 系统的用户,不论他们之前使用的是 Windows 还是 macOS,通常会在终端窗口尝试复制粘贴时遇到困惑。

在 Windows 系统中,你可以使用 Ctrl+C 来复制选中的文本,然后用 Ctrl+V 进行粘贴。 而在 macOS 中,对应的快捷键是 Command+C 和 Command+V。 这两者都遵循了 C 复制、V 粘贴的惯例。

这些相同的快捷键在大多数 Linux 图形应用中同样有效,比如文本编辑器 Gedit 或者办公软件 LibreOffice。 Ctrl+C 复制选中文本,Ctrl+V 将其粘贴到光标处。 新手 Linux 用户可能不会意识到这些约定在这些应用中已经沿用。 他们习惯性地使用这些快捷键,并继续工作。

但是,当新手用户打开终端窗口,并在 bash shell 命令提示符下尝试同样的操作时,一切都变了。 Ctrl+C 和 Ctrl+V 很早以前就被赋予了特定的功能。 实际上,这些快捷键早在图形界面出现之前就已存在,那时,电传打字机 (TTY) 还是主要的物理设备。

TTY 中的 Ctrl+C 和 Ctrl+V

当 TTY 还是物理设备时,Ctrl+C 被选为发送信号的快捷组合键。 这个信号是 SIGINT,指示当前运行的进程终止。 由于终端窗口是对 TTY 的模拟,这个快捷键组合(以及其他许多组合)被保留了下来。 请记住,终端窗口是一个模拟器。 而 Bash shell 是在这个模拟 TTY 中运行的一个程序。

我们可以轻松地验证 Ctrl+C 和 Ctrl+V 的功能。 假设你输入以下命令并按下回车键。

ls -R /

由于使用了 -R(递归)选项,ls 命令会从根目录开始列出所有文件和目录。 过一会儿,你可能意识到这并不是你想要的结果,这时你可以按下 Ctrl+C 来终止这个进程。

Ctrl+C

ls 进程被终止。 从截图中可以看到 Ctrl+C 的痕迹,它显示为 ^C。

Ctrl+V 组合键的作用是“逐字插入”。 它允许你将按键的实际表示形式输入到你正在键入的内容中,而不是执行按键的功能。 要体验一下,请尝试以下命令(不要输入逗号)。(例如,要尝试第一个,请按 Ctrl+V,然后按 Enter。)

Ctrl+V, Enter
Ctrl+V, PgDn
Ctrl+V, RightArrow
Ctrl+V, Esc

顺便说一句,你可能注意到 Enter 键显示为 ^M。 之前我们看到 Ctrl+C 显示为 ^C。 似乎 ^ 代表 Ctrl。 那么 Ctrl+M 是不是和 Enter 的作用相同呢? 在终端窗口中尝试一下,你会发现确实如此。

显然,我们不能指望 Ctrl+C 和 Ctrl+V 执行复制粘贴的功能,因为它们已经有了历史悠久的定义。那么我们该如何复制粘贴呢?

Ctrl+Shift+C 和 Ctrl+Shift+V

这两个快捷键很容易记忆,因为它们和对应的快捷键很相似,Ctrl+Shift+C 和 Ctrl+Shift+V 可以直接替代 Ctrl+C 和 Ctrl+V。

如果你用鼠标在终端窗口中选中一些文本,并按下 Ctrl+Shift+C,你就会将选中的文本复制到剪贴板缓冲区。

Ctrl+Shift+C

你可以使用 Ctrl+Shift+V 将复制的文本粘贴到相同的终端窗口或其他的终端窗口中。

Ctrl+Shift+V

你也可以将内容粘贴到图形应用程序中,例如 gedit。但请注意,当你向应用而不是终端窗口粘贴时,你需要使用 Ctrl+V。

你也可以反过来操作。在 gedit 中选中一些文本,然后按下 Ctrl+C,之后用 Ctrl+Shift+V 将其粘贴到终端窗口中。

组合键 Ctrl+Insert 的功能和 Ctrl+Shift+C 相同,组合键 Shift+Insert 的功能和 Ctrl+Shift+V 相同。需要注意的是,这些组合键只能在同一个终端窗口中使用。

使用鼠标:右键单击

你也可以使用鼠标在终端窗口中复制粘贴。既然你已经用鼠标选中了要复制的文本,为什么不直接用鼠标完成复制粘贴的操作呢?

在选中一些文本后,点击鼠标右键,并在上下文菜单中选择“复制”。

要粘贴复制的文本,再次右键单击鼠标,并在上下文菜单中选择“粘贴”。

文本将会粘贴到命令行上光标所在的位置。 在这个例子中,相对路径输入错误,Bash 无法改变目录。用户漏掉了路径开头的“~/”。 他们输入“~/”,然后从之前的尝试中复制了路径的剩余部分,并将其粘贴到第二行命令中。

当他们按下回车键后,他们就可以进入该目录了。

这个例子展示的是在同一个终端窗口中粘贴,但是你也可以使用这个右键单击的方法粘贴到不同的终端窗口。 你也可以用这种方法粘贴到图形应用程序中。

使用鼠标:中键

只要你的鼠标有中键,你就可以使用一种更快捷的方法来复制和粘贴。 如果你按下滚轮(轻轻地!),它会发出咔哒一声,这就说明你的鼠标有中键。

在终端窗口中选中一些文本,然后按下中键。 选中的文本会被粘贴到命令行上的光标位置。 复制和粘贴同时完成。

先选中一些文本:

然后按下中键:

你可以用这种方式在不同的终端窗口之间进行粘贴,也可以将其粘贴到图形应用程序中。 只需要选中文本,移动到另一个终端窗口或应用程序,然后按下中键即可。

老式方法——不用鼠标

如果不用鼠标该怎么办? 如果无法选中任何文本,如何复制粘贴?

Linux 服务器通常配置为没有图形桌面环境 (GDE),这意味着你不能使用鼠标。 即使在运行类似 GNOME 这样的图形桌面环境的 Linux 电脑上,并且你确实有鼠标,也可能会遇到无法使用鼠标选中文本的情况。

例如,你可能已经切换到了其他的 TTY 之一。 在现代的发行版中,这些 TTY 分别是 Ctrl+Alt+F3 (TTY3) 到 Ctrl+Alt+F6 (TTY6)。 (Ctrl+Alt+F2 会带你返回 GDE 会话,Ctrl+Alt+F1 会带你进入 GDE 的登录屏幕。)

也许你甚至正在使用真实的硬件 TTY 设备连接到 Linux 或 Unix 电脑。

不管怎样,这些技巧都能帮到你。 需要记住的是,这不是复制粘贴,而是剪切、复制和粘贴,并且只能从当前命令行进行剪切和复制。 当然,你可以使用方向键在历史记录中滚动,找到你想剪切、复制和粘贴的命令。

你可以使用的快捷键如下:

Ctrl+W:剪切光标前的单词,并将其添加到剪贴板缓冲区。
Ctrl+K:剪切光标后的行部分,并将其添加到剪贴板缓冲区。如果光标位于行首,则会剪切并复制整行。
Ctrl+U:剪切光标前的行部分,并将其添加到剪贴板缓冲区。如果光标位于行尾,则会剪切并复制整行。
Ctrl+Y:粘贴最后被剪切和复制的文本。

让我们切换到 TTY3。(之后用 Ctrl+Alt+F1 返回桌面。)

Ctrl+Alt+F3
tty

我们有一个要删除的文件,让我们检查一下。

ls -l file_to_delete.txt

如果我们使用向上箭头键,我们将会从命令历史记录中调用我们使用的最后一个命令。我们可以直接编辑这行命令,但为了演示剪切、复制和粘贴的功能,我们将用稍微冗长的方式完成删除文件的任务。

我们将光标移动到文件名的第一个字母,然后按下 Ctrl+K。这将删除该行的那部分并将文本复制到剪贴板缓冲区。

我们将按退格键,直到清空该行。

我们将输入 rm 来删除文件。

<img decoding=”async” class=”alignnone size-full wp-image-440716″ src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoYAAACTAgMAAABuYDDrAAAACVBMVEUAAAABAQHMzMygyw1NAAAD4UlEQVR42u3aQW7jOBAFUF/CDczsezOn8CU+gar9NyDepwz4ALVgTjkLUrKcdmxlRm5yMOUFQTFB8kCJpY9KDofxP0cM/jn9J4gyz/ng65oGIiavxJuJAHiBAQlpBKLIiigLcdLSnfjnVZ2izuvZ1Zmyq+tVXZ1MBvACZM9O6Ub8OVEolPM0CYWXBApJodCSAWw3uidRUInCT8RzPTAjELUIc7kn5pLLVL+lDECkCIk1UY0g6i7iMgyR5UYUEER7FhtRpp7HZUpGEax20SmUeqLnopOuPYvONZl6KhR1neC1COlcZgyAw9HvRj96Rz987sYiqm9bi6QTxJ2JMjpRGlFq5Op2LLYTKeMRqVd1ClhT4YhE40ShwFpYGJIoa2Ia71n8AUouwoRhd/EHKMTQxD8aUVoqHPC4/AQnSjK2VDgkUa/qydhS4Yile4xUuJ043B5GGPs/Eb/bX3TYbz1gG/uLDZUMSIDV67QQ23pbS+8iPusvLvs2Uz4R8V7ilv4irBUjAxKS1evs6oBe1WHq9So7JfvOxC39RditM5EdVq9rK4oTBUapVwmU3XdxS38RxvWNvifKPVH4BuLr/iJMAeRyI+ZyI+YCyyWhriV7A/F1fxEG/7SLWO0iYERCXXsj8Vl/EQbZSnzHjd7QX1wfl1+exdVxSfaW47Klv6ilFp3aDtXSrpeio0Udrp4MTsHeRefRO3pL8s4ft7FDjBgqNUYYC+I6CX4vE+6bKL8k2