Jak powtórzyć ostatnie polecenie bez użycia klawiszy strzałek?

115

Wiem, że mogę Upiterować po poprzednich poleceniach. Uruchomienie ostatniego polecenia wymaga po prostu Up+ Enter. Zastanawiałem się jednak nad zakupem Happy Hacking Keyboard, ponieważ spędzam dużo czasu vim.

Ta klawiatura nie ma klawiszy strzałek, a jedynym sposobem, w jaki wiem, jak uzyskać tego rodzaju zachowanie, jest naciśnięcie Ctrl+ Ri rozpoczęcie powtarzania poprzedniego polecenia.

Czy istnieje prosty sposób emulacji Up+ Enterw terminalu UNIX bez klawiszy strzałek?

ilościowo
źródło
1
Powinieneś zastąpić znacznik terminalu używaną powłoką.
Cristian Ciupitu
2
@ illumine nie mysz ...
ilościowo
Czy klawiatura Happy Hacking nie została wycofana w 2006 roku?
Peter Mortensen,
@PeterMortensen nie, wciąż jest dostępny. Być może masz na myśli pierwszą wersję, ale nowsze modele są nadal dostępne.
Quant

Odpowiedzi:

164

Z cshlub dowolnej powłoki wykonania csh-jak historia podstawienie ( tcsh, bash, zsh)

!!

Potem Enter.


Lub alternatywnie :

!-1

Potem Enter.


Lub Ctrl+ P,Enter


Magiczna przestrzeń

Zauważ też, że !!i !-1nie będzie się ono automatycznie rozwijało, dopóki ich nie wykonasz (kiedy może być za późno).

W przypadku korzystania bash, które można umieścić bind Space:magic-spacew ~/.bashrc, a następnie naciskając Spacepo poleceniu zostanie automatycznie rozszerzać je inline, dzięki czemu można je sprawdzić przed wykonaniem. Jest to szczególnie przydatne w przypadku rozszerzania historii od uruchomienia polecenia jakiś czas temu, np. !echoSpowoduje pobranie ostatniego uruchomienia polecenia, zaczynając od echo. Dzięki magicznej przestrzeni możesz wyświetlić podgląd polecenia przed jego uruchomieniem.

To odpowiednik robienia bindkey ' ' magic-spacew tcshlub zsh.

Krogulec
źródło
1
@Arman Cieszę się, że mogę pomóc. Istnieje wiele poleceń rozszerzania historii; link zawiera niektóre z nich. Zredagowałem w niektórych informacjach o magicznej przestrzeni, które mogą pomóc w korzystaniu z niektórych z nich.
Sparhawk
3
magic-spaceto jedna słodka opcja!
fduff
1
Istnieje również histverifyopcja, shoptktóra spowoduje, że readline wykona rozszerzenie historii, ale nie wykona polecenia po pierwszym naciśnięciu klawisza Enter. Który pozwoli Ci ocenić wynik i zdecydować, czy to właśnie chcesz uruchomić.
Etan Reisner
2
Nigdy nie rozumiem dlaczego !! jest używany o wiele więcej niż CTRL-P. CTRL-P pozwala zobaczyć polecenie przed jego wykonaniem - a nawet dokonać modyfikacji. Zawsze mam wrażenie, że rzucam kostką !!.
abonet,
1
@abonet Kolejnym zastosowaniem, które właśnie znalazłem, !!jest użycie jego rozszerzenia w miejscu . Na przykład sudo !!.
Sparhawk
50

Większość powłok z funkcją edycji wiersza poleceń obsługuje powiązania klawiszy Emacsa. (mały podzbiór)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

Alternatywnie możesz skonfigurować powłokę do korzystania z trybu edycji poleceń vi, dodając set -o vido pliku startowego powłoki (np ~/.bashrc.). Na przykład możesz

  • Użyj, EsckEnter aby ponownie wykonać poprzednie polecenie (tak samo jak !!). Klawisz minus -działa również jako polecenie „w górę”.
  • Użyj EsckkkkkkkkkkkkEnter lub, Esc12kEnter aby ponownie wykonać 12. poprzednie polecenie (to samo co !-12).
  • Użyj Esci polecenie ruchu (tj. kOdpowiednio powtórzone), a następnie edytuj znajdującą się tam linię poleceń bash. Pamiętaj, że nadal będzie w vitrybie poleceń, więc trzeba będzie użyć vipolecenia edycji (np I, A, C, R, lub jednym z ich małych odpowiedników), aby faktycznie dodać do polecenia z historii.
    Na przykład EsckisudoSpaceEnterjest równoważny sudo !!.
  • Dla zaawansowanych użytkowników: można nawet skopiować ( y ank) tekst z jednej linii i Wklej ( p ut) na innej, dzięki czemu można osiągnąć wyniki porównywalne !-2:- !$. (Niestety nie wydaje się, aby obsługiwał nazwane bufory).
Gilles
źródło
Wiedziałem o relacji emacsa z terminalem ... ale visztuczka była świetna !!!
Dox,
Dostałem za deleteCtl + u w Zsh
Timo
1
Jest to realizowane przez bibliotekę readline. Dalsze skróty można znaleźć w jego dokumentacji.
Spidey
28

Moim ulubionym jest CTRL+, Pa następnie CTRL+O

Działa to domyślnie, nie jest wymagana dodatkowa konfiguracja. ^ P pozwoli ci przejść do ostatniego polecenia, a ^ O pozwoli ci wykonać bieżącą linię

Pamiętaj, że CTRL+ Omoże być używana tyle razy, ile chcesz

stokrotka
źródło
2
^ O nic nie robi na moim Macu.
Snowcrash
1
@Snowcrash Try^J
stokrotka
to tylko echo pustej linii, nawet jeśli zrobiłem to wcześniej lslub pwdwcześniej.
Snowcrash,
@ Snowcrash To ^ P, a potem J J ...
stokrotka
Ctrl + P nie działa na HP-UX (nie wiem, jakiej powłoki używa). Obejściem tego problemu jest wywołanie `zsh '.
Peter Mortensen
15

Pewnie! Ponieważ jesteś przyzwyczajony do viskrótów klawiszowych, dlaczego nie skonfigurować swojej powłoki, aby na nie reagowała? Dla bashumieścić to w swoim ~/.inputrc:

set editing-mode vi

Uruchomienie instancji bash nie spowoduje ponownego odczytania pliku, więc wyloguj się i zaloguj ponownie.

zshwykryje to nawet za Ciebie: jeśli żaden ze skryptów startowych nie wymusza trybu edycji w taki czy inny sposób, bindkey a jeśli $EDITORwykryje vi, że zmienna środowiskowa zawiera , to automatycznie włączy viskróty klawiszowe. Jeśli musisz to wymusić, umieść to w ~/.zshrc:

bindkey -v

Następnie użyj, ESCjak zwykle, aby wejść do linii poleceń oraz ki jporuszać się w górę i w dół.

RÓWNIEŻ : Domyślnymi powiązaniami powłoki w większości powłok są wiązania emacs, więc właściwie Crtl-Pi Ctrl-Npowinny już działać bez konieczności zmiany czegokolwiek.

Celada
źródło
9

Z każdej muszli POSIX realizującego Przenośność użytkownika opcji (obejmuje ksh, zsh, bash, yash), można również użyć fcpolecenia:

fc -e : -1

Zobacz przykład:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

Więcej informacji w Wykonywanie szeregu poleceń z historii odpowiedzi Jonathana Lefflera.

fedorqui
źródło
6

Dla wszystkich użytkowników komputerów Mac iterm2:

Możesz powiązać + Rz 0x0C 0x10 0x0d. Spowoduje to wyczyszczenie terminala i uruchomienie ostatniego polecenia.

2 kluczowe preferencje

Brian Wigginton
źródło
Czy jest jakiś sposób, aby powtórzyć ostatnie polecenie bez czyszczenia terminala?
Luke Davis,
Ach, nieważne: dla każdego, kto to czyta, aby powtórzyć bez czyszczenia terminala, użyj 0x10 0x0d(tzn. Pomiń 0x0C).
Luke Davis,
5

Uważam, że muszę często powtarzać polecenia jako superużytkownik, więc

sudo !!

ponawia poprzednią komendę, jakbym pamiętał, aby sudow pierwszej kolejności pisać .

Jared Chmielecki
źródło
2
Naprawdę podoba mi się to, wygląda też na dobrą odpowiedź na „odmowę autoryzacji”. „Miałem na myśli sudo ffs!”
Viktor Mellgren,
3

kshPowłoka posiada domyślny alias r, który powtarza ostatnią komendę. Jest związany z fc -s:

alias r='fc -s'

Co ciekawe, bashdokumentacja fcwbudowanego ( help fca także samego podręcznika) nawet o tym wspomina, ale nie jest to domyślny alias w tej powłoce:

Przydatnym aliasem do użycia w tym przypadku jest to r='fc -s', że podczas wpisywania r cc uruchamiane jest ostatnie polecenie rozpoczynające się od, cca wpisywanie powoduje rponowne wykonanie ostatniego polecenia.

W bashdziałałoby to również, nawet jeśli wyłączyłeś rozszerzenia historii set +H.

W zshpowłoce znajduje się rwbudowane narzędzie, które udokumentowano jako takie samo jak fc -e -.

fcNarzędzie jest POSIX standardowym narzędziem .

Kusalananda
źródło
2

Z cshlub dowolnej powłoki realizacji csh-Jak Historia podstawienie ( tcsh, bash, zsh), można również użyć !<beginning of command>, aby wywołać ostatnie polecenie rozpoczynające się <beginning of command>.

na przykład jeśli uciekłeś

$ tail file.txt
$ less otherfile.txt
$ !ta

!ta wykonałby tail file.txt

Dan
źródło
1

tl; dr !!po prostu dołącza ostatnie polecenie do bieżącego polecenia. <backtick>!!<backtick> wykonuje ostatnie polecenie i dołącza dane wyjściowe do bieżącego polecenia.

W rzeczywistości istnieją 2 warianty:

  1. Ostatnie samo polecenie
  2. Wynik ostatniego polecenia

Pokażę 2 przykłady:

Przykład 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Jak widać powyżej, wykonuję polecenie i zasadniczo dołączam ostatnie polecenie.

Kolejna odmiana

Przykład 2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"
Pradyumna Shembekar
źródło
+1 dla vi `!!`. Bardzo przydatne
le_daim
0

Kiedy korzystam z dobrego emulatora xterm, np. Kit, moim ulubionym sposobem jest wybranie polecenia zawierającego wiersz, skopiowanie go do schowka, a następnie kliknięcie myszą prawym przyciskiem myszy. Powtarza to polecenie jednym kliknięciem. Działa to również dobrze dla sekwencji poleceń oddzielonych średnikami.

Bernard Perrin
źródło
0

możesz użyć !ndo wykonania n-tego polecenia w terminalu. gdzie „n” jest numerem historywiersza polecenia.

Ravi Sevta
źródło
Która powłoka rozwija !?się do ostatniego polecenia? Czy jesteś pewien, że się z tym nie mieszasz !!(co zostało już omówione w innych odpowiedziach)?
Anthony Geoghegan
przepraszam, eksperymentowałem wtedy z tym poleceniem. sprawdź poprawioną odpowiedź. @AnthonyGeoghegan
Ravi Sevta
To był skrót, którego szukałem. Dzięki!
le_daim
0
  • Wpisz History i zanotuj liczbę przed poleceniem, które chcesz wykonać i użyć !number

  • Możesz także użyć ! -1 (1 jest ostatnim wykonanym poleceniem, zamień go na liczbę zliczeń, którą otrzymujesz od dołu, zachowując ostatnie wykonanie jako 1)

  • ! -2 (przedostatni i tak dalej)
Kochać
źródło
0

Istnieje kilka warstw, w których możesz poprosić o ostatnie polecenie.

Edytor linii

Edytor linii (w którym wpisujesz swoje polecenia) jest dostarczany bezpośrednio przez ksh, przez bibliotekę readline w bash i przez bibliotekę zle w zsh. Inne powłoki, takie jak myślnik, mogą nie mieć biblioteki edycji do zrozumienia tych kluczy (chyba że zostaną skompilowane z --with-libeditwłączoną opcją).

Działa w ksh, bash, zsh:

Ctrl- P# Tryb Emacsa (poprzedni)
Ctrl- N# Tryb Emacsa (następny)
ESC- k Tryb # vi ESC, aby przejść do trybu poleceń ik w górę
ESC- j Tryb # vi ESC, aby przejść do trybu poleceń i j w dół

historia

System historii dostarczany przez wiele powłok pozwala na rozwinięcie niektórych skrótów:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

polecenia

Istnieje kilka poleceń, które mogą pobierać polecenia historii.

Podobnie jak dość szczegółowe polecenie (tylko do wydrukowania):

history 2 | head -n-1

lub starsze, a zatem zwykle bardziej przenośne fcpolecenie (bezpośrednio ponownie wykonuje):

fc -e - -1

A może prościej fc -s -1, ale zsh nie akceptuje takiej opcji dla fc.

Jeśli chcesz tylko drukować polecenia, należy: fc -nl -1 -1.

Aby edytować ustawienia FCEDITdo edytora tekstowego (Ex ed, Emacs, vi, itd.) I użyj fc bezpośrednio: fc -1.

Izaak
źródło