我经常发现自己使用以下方式将历史命令复制到剪贴板:
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 -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字符。Terminal和iTerm将语言环境变量设置为en_US之类的东西。但默认为UTF-8