2013-06-13 4 views
9

は、私は頻繁にこれを使用して、私のクリップボードに履歴コマンドをコピーし、自分自身を見つける:これはターミナルから正常に動作しますbash関数でpbcopyを使用するにはどうすればよいですか?スクリプト化できますか?

echo !123 | pbcopy

!123 = cd ..と仮定すると、それはこのようなものになります。

function pb() { 
    echo $1 | pbcopy 
} 

このコマンドはこのように、理想的には、呼び出される:pb !!

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

が人生を容易にするために、私は私の.bashrcにこのbashの機能を追加しました。ただし、これは機能しません。ここでは何が起こるかです:

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

どんなに私が呼び出すものを歴史コマンドは、常にクリップボードに!!を返しません。私もエイリアスを作ってみましたが、それは同じ問題共有:

alias pb='echo !! | pbcopy'

任意のポインタを?

+0

あなたは 'Ctrl-R'を使ってヒストリを逆方向に検索することに気づきますか? – devnull

+1

はい私はそうです。ただし、クリップボードには何もコピーされません(他のプログラムで使用するため)。 –

答えて

11

あなたの機能は多少間違っています。

[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が動作しない理由を説明するには、!!は単一引用符、および履歴の交換内側にある:それは代わりに、結果

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

ある$1

[email protected]を使用する必要があります!!が引用されていない場合に発生します。定義されたインタラクティブなコマンド履歴の代わりに、それを変数やエイリアスに保存することは非常に難しいです。

+1

はい、動作しています!ありがとう、本当に役に立ちました。 –

2

また、最後の履歴エントリを印刷する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のようなものにロケール変数を設定します。

関連する問題