skopiuj ostatnie polecenie w terminalu

22

Widzę ostatnie polecenie w terminalu, naciskając up arrowjak w poniższym przykładzie:

Wpisałem cd /:

Makss-Mac:~ maks$ cd /

... wciśnięty enter, polecenie cd /wykonane, a teraz mogę nacisnąć up arrowi zobaczyć polecenie cd /ponownie:

Makss-Mac:/ maks$ cd /

Chcę nie tylko zobaczyć ostatnie polecenie, ale skopiować je do schowka.

Być może istnieje skrót, który nie tylko pokazuje ostatnie polecenie w terminalu (jak up arrowto zrobić), ale jednocześnie kopiuje go do schowka.

A może jest skrót do wybierania wszystkich z bieżącej linii terminalowej. I tak będę mógł skopiować ostatnie polecenie (po naciśnięciu up arrow), naciskając super+c. Oczywiście mogę to wybrać za pomocą myszy. Ale kiedy polecenia są 10 razy dłuższe cd /, może to być zbyt czasochłonne, szczególnie jeśli robisz to co 30 sekund.

A może istnieje sposób na napisanie wtyczki do terminalu

Maksym Jefremow
źródło
Znalezienie rozwiązania tutaj może być łatwiejsze, jeśli możesz dodać kilka szczegółów na temat tego, co zamierzasz zrobić z zawartością schowka. Gdzie zamierzasz to wkleić?
nohillside
tak, aby wkleić go do innej karty terminalu
Maxim Yefremov

Odpowiedzi:

17

Umieść to w swoim ~/.bashrc ~/.bash_profilelub gdziekolwiek chcesz:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

Po otwarciu nowego okna (lub uruchomieniu source ~/.bash_profile) powinieneś być w stanie uruchomić copyLastCmdi mieć polecenie w schowku.

Aby wyjaśnić, co się dzieje: w zasadzie używasz polecenia „fix command” ( fc), aby uzyskać ostatnie polecenie, usuń zarówno początkowe, jak i końcowe białe spacje, aby uzyskać lepsze formatowanie, awka następnie skopiuj je na pulpit komputera Mac pbcopy.

EDYTOWAĆ:

Teraz, gdy wiemy, że chcesz skopiować i wkleić na inną kartę terminala, istnieje inna opcja: dodaj te linie do swojego ~/.bashrc ~/.bash_profilelub gdziekolwiek chcesz:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Następnie, gdy otworzysz kilka nowych kart (nazwijmy je „kartą A” i „kartą B”):

  1. Wykonaj dowolne polecenie na karcie A
  2. Przejdź do zakładki B, naciśnij enter na pustym wierszu, dając ci „świeży” nowy wiersz (i tym samym ponownie oceniając historię)
  3. użyj strzałki w górę raz i powinieneś mieć polecenie, które właśnie wprowadziłeś na karcie A.

EDIT 2: Mam zastąpił wykorzystanie sedze awkw pierwotnej odpowiedzi powyżej, aby zadbać zarówno początkowe i końcowe białe znaki.

Asmus
źródło
To świetny alias! Aby odciąć końcowy nowy wiersz, aby móc edytować polecenie po wklejeniu, użyłem awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler
@nwinkler: OH masz rację, powinieneś użyć awk: fc -ln -1 | awk '{$1=$1}1'usunie zarówno końcowe, jak i wiodące białe znaki.
Asmus
1
musiał zmodyfikować alias dla specjalnych znaków alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". wciąż dostaje moją opinię
Mike D
1
Używałem tego, dopóki nie wykonałem „git -reset --hard” na jednym terminalu, aw innym „niczego nie podejrzewającym folderze git” nacisnąłem strzałkę w górę i szybko wprowadziłem, ponieważ myślałem, że uruchamiam skrypt, którego wcześniej używałem. Możecie sobie wyobrazić, co się stało, i to był ostatni raz, kiedy korzystałem z tej wspólnej „globalnej” historii
MrGigu
@MrGigu przydarzyło mi się z „lokalną” historią, w której dwukrotnie nacisnąłem strzałkę „w górę”, a nie raz, przypadkowo - chyba nauczyłem się lekcji.
Asmus,
5

Oto kolejne ujęcie oparte na odpowiedzi @Asmus. Aby jego alias działał w moim skrypcie bash, musiałem trochę cytować, ponieważ pojedyncze cudzysłowy nie działają w aliasie pojedynczego cudzysłowu bez dodatkowych cytatów:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

'\''Będzie w zasadzie zamknąć bieżącą ofertę, a następnie dodać zbiegłego cytat, a następnie ponownie otworzyć rzeczywistej kalkulacji.

Powyższa wersja będzie kopiować ostatnią komendę do schowka, a raz go wkleić, to natychmiast wykonywane, ponieważ będzie to miało nowej linii na końcu.

Aby pozbyć się nowego wiersza na końcu, aby móc edytować polecenie przed jego uruchomieniem, możesz wykonać następujące czynności:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

ORS=''(To bez cytowania) będą zdejmować z tyłu znak nowej linii, dzięki czemu można edytować wklejony tekst przed jego uruchomieniem.

nwinkler
źródło
5

Pozwoli to wykorzystać interpretację historii chwycić ostatnią komendę i echo go. Możesz potokować, aby pbcopyzapisać ostatnie polecenie w schowku.

> echo !! | pbcopy

Jeśli chcesz, aby polecenie z historii nie było ostatnim , możesz uruchomić:

> history

I odwołaj się do żądanego numeru polecenia, takiego jak:

> echo !5 | pbcopy
Sam Berry
źródło
Może to być twoje ulubione i może nawet działać, ale musisz podać trochę wyjaśnień na temat tego, co faktycznie robi to polecenie i jak OP (który zaakceptował jedną z odpowiedzi pięć lat temu) może z niej skutecznie korzystać.
IconDaemon,
@IconDaemon dobre połączenie. Myślę, że warto to dodać do starego pytania, ponieważ jest ono prostsze niż zaakceptowana odpowiedź, ponieważ nie wymaga dostosowania profilu.
Sam Berry,
4

Przybyłem tutaj, ponieważ wymyśliłem dokładnie tę samą odpowiedź Sama Berry'ego, ale to nie działa dla mnie (OSX 10.14.6).

Udało się to zrobić dzięki cytatom wokół !!:

echo "!!" | pbcopy

Chris Gillatt
źródło
3

Możesz ustawić swoją historię, aby ignorowała polecenia zaczynające się od spacji:

export HISTIGNORE=' *'

A następnie uruchom następujące polecenie, aby uzyskać ostatnie polecenie do schowka (upewnij się, że masz spację na początku):

history 1 | cut -d " " -f 4- | pbcopy

Prawdopodobnie zechcesz wtedy zapisać polecenie jako alias, aby ułatwić zapamiętanie.

kidbrax
źródło