如何在bash函数中使用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'

指针吗?

您的函数有些错误。它应该使用$@而不是$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不起作用,!!在单引号内,如果!!没有被引用,则会发生历史替换。由于它是命令历史记录的替代品,根据定义,命令历史记录是交互式的,因此将其保存到变量和别名中非常棘手。

您也可以使用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字符。Terminal和iTerm将语言环境变量设置为en_US之类的东西。但默认为UTF-8

相关内容

  • 没有找到相关文章

最新更新