2013-06-13 26 views
9

często znajduję się kopiowania poleceń historia mojego schowka, używając tego:Jak korzystać z pbcopy w funkcji bash? Czy można to skryptować?

echo !123 | pbcopy

To działa prawidłowo z terminalu. Zakładając !123 = cd .., wygląda mniej więcej tak:

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

Aby ułatwić życie, dodałem tę funkcję bash do mojego .bashrc:

function pb() { 
    echo $1 | pbcopy 
} 

Komenda ta będzie wywoływana, najlepiej, jak to: pb !! . Jednak to nie działa. Oto co się dzieje:

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

Nieważne co komenda historia modlę, to zawsze wraca !! do schowka. Próbowałem dokonywania alias też, ale że dzieli ten sam problem:

alias pb='echo !! | pbcopy'

Wszelkie wskazówki?

+0

Czy zdajesz sobie sprawę, że robisz odwrotnego wyszukiwania w historii przy użyciu 'Ctrl-R'. – devnull

+1

Tak, jestem. Jednak to nie kopiuje niczego do schowka (do użytku w innych programach). –

Odpowiedz

11

Twoja funkcja jest nieco błędna. Należy używać [email protected] zamiast $1

że jest

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

Rezultat:

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

Aby wyjaśnić, dlaczego alias nie działa, !! jest wewnątrz apostrofami i zastąpienie historii dzieje się, jeśli !! nie jest cytowany. Ponieważ jest to zamiennik historii poleceń, która jest interaktywna z definicji, zapisywanie jej w zmiennych i aliasach jest bardzo trudne.

+1

tak, działa! Dzięki, to było naprawdę pomocne. –

2

Można również użyć fc -l -1 lub history -p '!!' wydrukować ostatni wpis Historia:

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

Jeśli LC_CTYPE jest C, pbcopy garbles się znaki spoza ASCII. Terminal i iTerm domyślnie ustawiają zmienne lokalne na coś podobnego do en_US.UTF-8.