11

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

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'

任何指针?

4

2 回答 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不起作用,!!在单引号内,如果没有被引用,就会发生历史替换!!。由于它是命令历史的替代品,根据定义是交互式的,因此将其保存到变量和别名中非常棘手。

于 2013-06-13T08:56:55.553 回答
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 之类的东西。

于 2013-06-13T13:24:39.697 回答