![Linux 剪贴板,包括 WSL 控制台](https://linux22.com/image/196948/Linux%20%E5%89%AA%E8%B4%B4%E6%9D%BF%EF%BC%8C%E5%8C%85%E6%8B%AC%20WSL%20%E6%8E%A7%E5%88%B6%E5%8F%B0.png)
我突然想到,任何给定的 Linux 控制台上都有多个剪贴板:
首先是bash剪贴板,可以通过Ctrl-U / K调用,将光标之前(U)或之后(K)的所有行剪切到剪贴板中,或者Ctrl-W,剪切光标左侧的单词(是否有相应的“右侧剪切单词”?),然后按 Ctrl-Y 粘贴到其他地方。
然后我们有 X 剪贴板,其设置如下(我不知道名称
pbcopy
和pbpaste
来自哪里,但我已经看到这些名称数十次,所以似乎很多人出于某种原因使用该命名法):
sudo apt install xclip xsel
alias pbcopy='xclip -selection clipboard' # To use xclip for copy
alias pbpaste='xclip -selection clipboard -o' # To use xclip for paste
alias pbcopy='xsel --clipboard --input' # To use xsel for copy
alias pbpaste='xsel --clipboard --output' # To use xsel for paste
- 此外,如果您使用 WSL,还有来自 Windows 的第三个剪贴板,您可以非常简单地将其发送到,例如
echo 123 | clip.exe
.要执行相反的操作并粘贴到 WSL 控制台中,您可以使用powershell.exe -noprofile Get-Clipboard > file.txt
.
如果能够完全控制如何轻松地从这些不同的剪贴板发送/检索信息,那就太好了。
我可以将信息通过管道传输到 X 剪贴板(使用 xclip 和 xsel),但我还没有找到将内容通过管道传输到 bash 缓冲区的方法;我们如何以编程方式输入 bash 缓冲区?
如何从单个命令中的一个输出将某些内容通过管道传输到所有 4 个剪贴板(假设 和
xclip
是xsel
独立的?)(我似乎记得tee
可以做到这一点,但不确定)?了解这一点后,我就能够从 4 个剪贴板中的任何一个发送接收信息。
echo 123 | <way-to-pipe-the-output-to-all-or-any-clipboards>
仅供参考,虽然没有回答上述问题。https://stackoverflow.com/questions/5130968/how-can-i-copy-the-output-of-a-command-directly-into-my-clipboard
答案1
我不知道 pbcopy 和 pbpaste 的名字从何而来
这些是 Mac 上的命令行工具。
bash 剪贴板
这并不是一个真正的剪贴板,而是一个内部缓冲区阅读线使用的库bash
。它被称为杀环,遵循 emacs,并且与 emacs 中一样工作。有关更多详细信息,请参阅man bash
阅读行部分。
然后我们就有了X剪贴板,其设置如下
实际上X本身与a一起工作初级和次级选择,并且选择由应用程序管理,而不是由 X 服务器管理。 X 剪贴板是对此的补充。
更糟糕的是,像 Gtk 这样的库确实有自己的自己的剪贴板。
我还没有找到一种方法将东西输入 bash 缓冲区
手册页没有提到任何以某种方式操纵 Kill Ring 的方法(至少我不知道),尽管您可以重新绑定在 Kill Ring 上工作的各种命令。
如何将某些内容通过管道传输到所有 4 个剪贴板中
你不能,除非你编写自己的命令,或者使用不同的现有命令。
如果你想保持 X 选择和 Windows 剪贴板同步(因此更改一个会更改另一个),我想我已经看到了这方面的工具,但我必须再次搜索自己。
考虑到架构,让所有 bash 实例中的终止环与某些东西保持同步是行不通的。没有什么可以阻止您从 X 或 Windows 粘贴到终端中。
如果您在想“但我可以在 Windows 下使用单个剪贴板,所以我想在 WSL 下使用相同的剪贴板”:这不是它的工作原理。
答案2
有几个问题,但我认为归结为:
- 如何通过管道连接到 Bash(技术上是 Readline)杀环
- 如何同时通过管道传输到多个剪贴板命令
通过管道连接到 Bash/Readline 杀环
Readline 不提供任何直接操作命令。据我通过查看文档得知,除了rl_kill_text
需要输入文本(或通过 插入rl_insert_text
)的功能之外,它甚至不提供任何对 Kill Ring 的 API 访问。
在理论您可以使用类似“sendkeys”的机制来插入要加载到杀伤环上的文本,然后“sendkeys” CtrlU.但我无法xdotool
在 Windows 11 下的 WSLg xterm 窗口中使用它。
另请参阅这个问题有关将文本(理论上可以包括 的控制代码CtrlU)插入到 中的相当详细的讨论bash
。
但现在,我不得不将其保留为“也许这是可能的,但据我所知,还没有人弄清楚”。
奖励:通过管道连接到tmux
粘贴缓冲区
我知道评论中提到了这一点,所以我想我应该添加它,因为我无法为您提供 Bash/Readline 解决方案。
这个很简单:
echo "Hello, World" | tmux load-buffer -
通过管道输出到多个命令
虽然这已经很好地涵盖了这个答案xclip
就语法而言,管道中的行为存在一些细微差别。
该问题的接受答案中列出的一般结构是:
command | tee >(pipe1) >(pipe2) >(pipe3)
xclip
但当这些命令之一时似乎存在一些不一致。我相信这xclip
与运行时与终端分离有关。
作为解决方法,只需将管道的最终结果输出到xclip
:
echo "Hello, World" | tee >(clip.exe) >(tmux load-buffer -) | xclip
测试脚本:
#!/usr/bin/bash
echo "1" | xclip
echo "2" | clip.exe
echo "3" | tmux load-buffer -
echo "Hello, World" | tee >(clip.exe) >(tmux load-buffer -) | xclip
xclip -o
powershell.exe -noprofile Get-Clipboard | tr -s '\r' '\n'
tmux show-buffer