我经常发现自己使用以下命令将历史命令复制到剪贴板:
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'
任何指针?
答案 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 -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。