在Bash脚本中实现与剪贴板的交互

在Bash脚本中实现与剪贴板的交互

技术背景

在Bash脚本编写过程中,有时需要将脚本输出复制到剪贴板,或者从剪贴板获取内容进行处理。然而,Bash本身并没有直接提供与剪贴板交互的功能,因此需要借助一些工具或辅助应用来实现。

实现步骤

不同系统下的实现方式

Linux - X Window System

在Linux的X Window系统中,常用的工具是xclipxsel

  1. 安装xclip
    • 使用apt-getsudo apt-get install xclip
    • 使用pacmansudo pacman -S xclip
    • 使用dnfsudo dnf install xclip
  2. 使用xclip
    • 复制内容到剪贴板:echo "test" | xclip -selection c
    • 从剪贴板获取内容:xclip -selection c -o
  3. 使用xsel
    • 复制内容到剪贴板:echo "test" | xsel -b
    • 从剪贴板获取内容:xsel -b -o

Linux - Wayland

在Wayland环境下,可以使用wl-clipboard

  1. 安装wl-clipboard
    • 使用apt-getsudo apt-get install wl-clipboard
    • 使用pacmansudo pacman -S wl-clipboard
    • 使用dnfsudo dnf install wl-clipboard
  2. 使用wl-clipboard
    • 复制内容到剪贴板:echo "test" | wl-copy
    • 从剪贴板获取内容:wl-paste

macOS

在macOS系统中,系统自带了pbcopypbpaste工具。

  1. 复制内容到剪贴板echo "test" | pbcopy
  2. 从剪贴板获取内容pbpaste

Windows

在Windows系统中,有多种实现方式:

  1. Windows Subsystem for Linux (WSL):使用clip.exe,例如cat file | clip.exe
  2. Cygwin:可以使用/dev/clipboard,如cat /dev/clipboardecho "foo" > /dev/clipboard

跨平台脚本示例

以下是一个跨平台的Bash脚本,用于读取剪贴板内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/bash
# WF 2013-10-04
#
# Multi-platform clipboard read access
#
# Supports
# Mac OS X
# Git shell / Cygwin (Windows)
# Linux (e.g., Ubuntu)

#
# Display an error
#
error() {
echo "error: $1" 1>&2
exit 1
}

#
# getClipboard
#
function getClipboard() {
os=`uname`
case $os in
# Git Bash (Windows)
MINGW32_NT-6.1)
cat /dev/clipboard;;
# Mac OS X
Darwin*)
pbpaste;;
# Linux
Linux*)
# Works only for the X clipboard - a check that X is running might be due
xclip -o;;
*)
error "unsupported os $os";;
esac
}

tmp=/tmp/clipboard$$
getClipboard >$tmp
cat $tmp
# Comment out for debugging
rm $tmp

核心代码

将文件内容复制到剪贴板

1
2
3
4
5
6
7
8
# Linux - X Window
cat file.txt | xclip -selection c

# macOS
cat file.txt | pbcopy

# Windows - WSL
cat file.txt | clip.exe

从剪贴板获取内容并保存到文件

1
2
3
4
5
# Linux - X Window
xclip -selection c -o > output.txt

# macOS
pbpaste > output.txt

最佳实践

  • 别名设置:为了方便使用,可以在.bashrc.bash_aliases中设置别名。例如:
1
2
3
4
5
6
7
# Linux - X Window
echo 'alias setclip="xclip -selection c"' >> ~/.bash_aliases
echo 'alias getclip="xclip -selection c -o"' >> ~/.bash_aliases

# macOS
echo 'alias pbcopy="xclip -selection c"' >> ~/.bash_aliases
echo 'alias pbpaste="xclip -selection clipboard -o"' >> ~/.bash_aliases
  • 处理换行符:在复制内容时,如果不想包含换行符,可以使用echo -n。例如:echo -n "test" | xclip -selection c

常见问题

  1. xclip复制内容后无法使用Ctrl + V粘贴:需要确保使用xclip -selection c,或者设置别名alias xclip="xclip -selection c"
  2. 在Wayland环境下xclip无法使用:在Wayland环境下,应使用wl-clipboard工具。
  3. Windows下使用/dev/clipboard时换行符丢失/dev/clipboard在处理换行符时可能存在问题,可以使用clip.exe替代。

在Bash脚本中实现与剪贴板的交互
https://119291.xyz/posts/2025-04-23.interaction-with-clipboard-in-bash-script/
作者
ww
发布于
2025年4月23日
许可协议