在macOS上,将命令的输出结果复制到剪贴板
在日常的工作中, 经常使用命令的小伙伴可能会遇到一个场景, 就是把命令执行的结果复制出来另作它用.
每次都需要通过鼠标进行选择然后复制, 虽然 macOS 的命令行的复制快捷键和普通的复制是一样的, 非常友好, 但是还要选择, 还是有些复杂.
当然, 也可以使用 tmux
, 然后使用类似 vi
的方式进行选择和复制, 但是操作还是非常多的. 虽然操作多, 但是是可以抛弃鼠标, 也是一个不错的选择.
如果有一种方式只在输入命令的时候假如几个字母就可以做到就更好了.
在 tmux 中对命令窗口的内容进行复制
旧版本的配置:
# use vi mode
set-window-option -g mode-keys vi
list-keys -t vi-copy
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
新版本的配置:
# use vi mode
set-window-option -g mode-keys vi
list-keys -T copy-mode-vi
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel
- 进入
copy-mode-vi
:在tmux
中,使用默认的快捷键Ctrl-b [
或Ctrl-b PageUp
来进入copy-mode-vi
。 - 使用
vi
风格的按键操作选择文本。通常情况下,您可以使用v
键来启动选择模式,然后使用移动键(如h
、j
、k
、l
)来选择文本。 - 确保您正确选择了文本。选中的文本将会显示为反白。如果选择不正确,您可以继续使用
vi
风格的按键进行调整。 - 一旦您选择了所需的文本,按下
y
键,这将触发bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel
命令。
对于第 3
点要特别说明一下, 不一定按下 y
键, 就可以复制. 和系统里面 vi
设置有关. 例如在 vi
中禁止了 cmd + c
复制, 使用 \+y
复制到剪贴板, 那么在这里就要使用 \+y
.
总结:
- 优点:
- 这种方式的好处是可能复制命令行里面的任何内容, 而且可以结合
vi
操作, 可以得到自己想要的部分. - Linux, macOS 都可以用
- 这种方式的好处是可能复制命令行里面的任何内容, 而且可以结合
- 缺点: 操作略微多了一些
如果有一个方式可以类似管道一样的操作那点方便很多. 其实 macOS 已经再带了这种命令.
macOS 使用pbcopy命令
- macOS自带了
pbcopy
和pbpaste
命令,用于与剪贴板进行交互。要将命令的输出复制到剪贴板,可以使用管道|
将命令的输出传递给pbcopy
。例如:
your-command | pbcopy
这将把命令的输出复制到剪贴板,您可以随后使用粘贴操作(通常是Command + V)将其粘贴到其他地方。
- 使用echo和重定向:
echo "Hello, World" | pbcopy
这将 “Hello, World” 复制到剪贴板。
- 使用Shell函数:
您可以将以下Shell函数添加到您的.bashrc或.zshrc文件中,以便更方便地将命令的输出复制到剪贴板:
# Function to copy command output to clipboard
copy_to_clipboard() {
"$@" | pbcopy
echo "Command output copied to clipboard."
}
然后,您可以使用 copy_to_clipboard
函数来执行命令,并将其输出复制到剪贴板。例如:
copy_to_clipboard your-command
这会将 your-command 的输出复制到剪贴板。
这些方法可在macOS上方便地将命令的输出复制到剪贴板,以便稍后粘贴到其他应用程序中。
这个方式可以用, 但是不可以使用 alias
的命令, 例如 zsh
下常用的 l
(l='ls -lah'
)
改进
- 修改一个简单的名字, 便于输入
- 结果照样输出
- 支持使用了
alias
的命令
copy() {
if [[ -n "$1" ]]; then
if alias "$1" &> /dev/null; then
c="$(alias "$1")"
c=${c#*=}
c=${c#*\"}
c=${c%*\"}
c=${c#*\'}
c=${c%*\'}
nc="$c "
for arg in "${@:2}"; do
nc="${nc}${arg} "
done
nc="${nc% }"
eval "$nc" | pbcopy
else
$@ | pbcopy
fi
pbpaste
echo ""
echo "Command output copied to clipboard."
else
echo "Usage: copyto <command>"
fi
}