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

时间:2013-06-13 05:23:13

标签: macos bash terminal .bash-profile pbcopy

我经常发现自己使用以下命令将历史命令复制到剪贴板:

echo !123 | pbcopy

终端可以正常工作。假设!123 = cd ..,它看起来像这样:

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

为了让生活更轻松,我将这个bash函数添加到我的.bashrc:

function pb() {
    echo $1 | pbcopy
}

理想情况下,将调用此命令,如下所示:pb !!。但是,这不起作用。以下是发生的事情:

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

无论我调用什么历史命令,它总是将!!返回到剪贴板。我也尝试过制作别名,但是它有同样的问题:

alias pb='echo !! | pbcopy'

任何指针?

2 个答案:

答案 0 :(得分: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不起作用,!!在单引号内,如果未引用!!,则会发生历史记录替换。因为它是命令历史的替代品,根据定义是交互式的,将它保存到变量和别名中是非常棘手的。

答案 1 :(得分:3)

您还可以使用fc -l -1history -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。