2013-06-13 4 views
9

Ich finde mich oft Geschichte Befehle meiner Zwischenablage kopieren diese mit:Wie verwende ich pbcopy in einer Bash-Funktion? Kann es gescriptet werden?

echo !123 | pbcopy

Dieses aus dem Terminal funktioniert gut. Unter der Annahme, !123 = cd .., es so etwas wie folgt aussieht:

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

Um das Leben zu erleichtern, habe ich diese bash Funktion meiner Bashrc:

function pb() { 
    echo $1 | pbcopy 
} 

Dieser Befehl aufgerufen werden würde, im Idealfall, wie folgt aus: pb !! . Dies funktioniert jedoch nicht. Hier ist, was passiert:

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

Egal, welche Geschichte Befehl rufe ich, es gibt immer !! in die Zwischenablage. Ich habe versucht zu einem Aliasnamen zu machen, aber das teilt das gleiche Problem:

alias pb='echo !! | pbcopy'

Alle Zeiger?

+0

Ist Ihnen bewusst, dass Sie eine umgekehrte Suche nach dem Verlauf durchführen, indem Sie 'Strg-R' verwenden. – devnull

+1

ja ich bin. Allerdings kopiert das nichts in die Zwischenablage (zur Verwendung in anderen Programmen). –

Antwort

11

Ihre Funktion ist etwas falsch.

[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 $ 

Um zu erklären, warum die alias nicht funktioniert, die !! ist in einfache Anführungszeichen, und die Geschichte Ersatz: Es [email protected] statt $1

die

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

Das Ergebnis ist verwenden sollten passiert, wenn !! nicht zitiert wird. Da es sich um eine Ersetzung in der Befehlshistorie handelt, die per Definition interaktiv ist, ist es sehr schwierig, sie in Variablen und Aliase zu speichern.

+1

ja, es funktioniert! Danke, das war sehr hilfreich. –

2

Sie könnten auch fc -l -1 oder history -p '!!' verwenden, um den letzten Historieneintrag zu drucken:

pb() { 
    [[ $# = 0 ]] && local n=-1 || local n="$1 $1" 
    fc -l $n | cut -d' ' -f2- | printf %s "$(cat)" | LC_CTYPE=UTF-8 pbcopy 
} 

Wenn LC_CTYPE C, pbcopy garbles Nicht-ASCII-Zeichen. Terminal und iTerm setzen die Gebietsschemavariablen jedoch standardmäßig auf etwas wie en_US.UTF-8.

Verwandte Themen