如何在bash函数中使用pbcopy?它可以编写脚本吗?

11

我经常使用以下命令将历史记录的命令复制到剪贴板:

echo !123 | pbcopy

在终端中这个命令很有效。假设!123 = cd ..,它会显示类似于下面的内容:

$ echo !123 | pbcopy
echo cd .. | pbcopy
    //result: `cd ..` is in the clipboard

为了让生活更加轻松,我在我的.bashrc文件中添加了这个bash函数:

function pb() {
    echo $1 | pbcopy
}

理想情况下,此命令应该像这样调用:pb !!。然而,这并不起作用。以下是发生的情况:

$ pb !123
pb cd .. | pbcopy
    //result: `!!` is in the clipboard
无论我使用什么历史命令,它总是将!!返回到剪贴板。我尝试使用别名,但是同样存在这个问题: alias pb='echo !! | pbcopy' 有什么建议吗?

你知道可以使用 Ctrl-R 进行历史记录的反向搜索吗? - devnull
1
是的,我可以。但是这并不会将任何内容复制到剪贴板中(以供其他程序使用)。 - JP Lew
2个回答

12

你的函数有点错误。它应该使用$@而不是$1

也就是说

function pb() {
    echo "$@" | pbcopy
}

结果:

samveen@minime:/tmp $ function pb () { echo "$@" | pbcopy ; }
samveen@minime:/tmp $ pb !2030
pb file `which bzcat`
    //result: `file /bin/bzcat` is in the clipboard
samveen@minime:/tmp $
为了解释为什么alias不起作用,因为!!位于单引号内, 而如果!!没有被引用,则会发生历史替换。由于这是对交互式命令历史记录的替换,而交互式定义意味着将其保存到变量和别名中非常棘手。

3

您也可以使用fc -l -1或者history -p '!!'来打印最近的历史记录条目:

pb() {
  [[ $# = 0 ]] && local n=-1 || local n="$1 $1"
  fc -l $n | cut -d' ' -f2- | printf %s "$(cat)" | LC_CTYPE=UTF-8 pbcopy
}

如果 LC_CTYPE 是 C,pbcopy 会破坏非 ASCII 字符。然而,默认情况下终端和iTerm将区域变量设置为类似 en_US.UTF-8 的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接