2013-06-13 49 views
9

我經常發現自己複製歷史命令使用這個我的剪貼板:如何在bash函數中使用pbcopy?它可以編寫腳本嗎?

echo !123 | pbcopy

這個工作從終端罰款。假設!123 = cd ..,它看起來是這樣的:

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

爲了使生活更輕鬆,我加入這個慶典功能對我的.bashrc:

function pb() { 
    echo $1 | pbcopy 
} 

此命令會被調用,理想情況下,像這樣:pb !! 。但是,這不起作用。這是發生了什麼:

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

無論我怎樣調用history命令,它總是返回!!到剪貼板。我試圖使一個別名太多,但共享相同的問題:

alias pb='echo !! | pbcopy'

任何指針?

+0

您是否知道您使用'Ctrl-R'對歷史進行了反向搜索。 – devnull

+1

是的,我是。但是,它不會將任何內容複製到剪貼板(用於其他程序)。 –

回答

11

你的功能有些不對。它應該使用[email protected]代替$1

function pb() { 
    echo "[email protected]" | pbcopy 
} 

結果:

[email protected]:/tmp $ function pb() { echo "[email protected]" | pbcopy ; } 
[email protected]:/tmp $ pb !2030 
pb file `which bzcat` 
    //result: `file /bin/bzcat` is in the clipboard 
[email protected]:/tmp $ 

解釋爲何alias不工作,!!是單引號,和歷史裏面更換如果沒有引用!!,則會發生。由於它是命令歷史上的替代品,按定義交互,將它保存到變量和別名中非常棘手。

+1

是的,它的工作!謝謝,這真的很有幫助。 –

2

你也可以使用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 garbles了非ASCII字符。終端和iTerm默認設置locale變量類似en_US.UTF-8。

相關問題