2013-06-13 5 views
9

Spesso mi capita di copiare i comandi di storia per il mio appunti usando questo:Come si usa pbcopy in una funzione bash? Può essere copiato?

echo !123 | pbcopy

Questo funziona bene dal Terminal. Supponendo !123 = cd .., sembra qualcosa di simile:

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

per rendere la vita più facile, ho aggiunto questa funzione bash al mio .bashrc:

function pb() { 
    echo $1 | pbcopy 
} 

Questo comando sarebbe invocata, idealmente, in questo modo: pb !! . Tuttavia, questo non funziona. Ecco cosa succede:

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

Non importa quale sia il comando storia invoco, ritorna sempre !! negli appunti. Ho provato a fare un alias troppo, ma che condivide lo stesso problema:

alias pb='echo !! | pbcopy'

Tutti gli indicatori?

+0

Sei consapevole di eseguire una ricerca inversa nella cronologia usando 'Ctrl-R'. – devnull

+1

sì, lo sono. Tuttavia ciò non copia nulla negli appunti (per l'uso in altri programmi). –

risposta

11

La tua funzione è un po 'errata. Si dovrebbe usare [email protected] invece di $1

che è

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

Il risultato:

[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 
samv[email protected]:/tmp $ 

a spiegare perché il alias non funziona, il !! è dentro virgolette singole, e la sostituzione di storia succede se !! non è quotato. Poiché è una sostituzione nella cronologia dei comandi, che è interattiva per definizione, salvarla in variabili e alias è molto complicata.

+1

sì, funziona! Grazie, è stato davvero utile. –

2

Si potrebbe anche usare fc -l -1 o history -p '!!' per stampare l'ultima voce della storia:

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

Se LC_CTYPE è C, pbcopy confonde fino caratteri non ASCII. Terminal e iTerm impostano le variabili locali su qualcosa come en_US.UTF-8 di default.

Problemi correlati