Jak przywołać poprzednie polecenie (bez wykonania), aby je zmienić?

14

Nie pamiętam sztuczki, w której mogłem uzyskać ostatnie polecenie bez jego uruchomienia:

powiedzmy, że chcę mieć dostęp do polecenia! 1255 po naciśnięciu klawisza strzałki w górę i zmodyfikowaniu polecenia. Jaki jest więc sposób na wywołanie polecenia, aby był wyświetlany w wierszu polecenia, ale nie był wykonywany, a następnie dostępny za pomocą klawisza strzałki w górę?

Próbowałem umieścić echo, ale potem mam echo przed poleceniem, nie pamiętam, jak to zrobić poprawnie.

Arturas M.
źródło
4
jeśli dobrze rozumiem twoją prośbę, być może po prostu spróbuj sufiksu „: p” jak w „! 1255: p”
Theophrastus
@Theophrastus tak, dokładnie, zapomniałem o tym: część p i nie mogłem znaleźć odpowiednich słów kluczowych w google, aby je znaleźć ... Dzięki chłopaki.
Arturas M

Odpowiedzi:

21
!1255:p

Zrobię to

!przywoływanie historii
1255jest
:pdrukowaniem numeru wiersza, ale nie jest wykonywane

Następnie możesz użyć strzałki w górę, aby cofnąć poprzednie (niewykonywane) polecenie i możesz je zmienić w razie potrzeby.

Często łączę to z hg(„History Grep”) - moim ulubionym pseudonimem.

$ alias hg  # Maybe use hgr instead if you are a Mercurial CLI user.
alias hg='history | tail -200 | grep -i'

Wyszukuje tekst w najnowszej linii historii, bez względu na wielkość liter i jest używany w ten sposób:

Kiedy chcę wyszukać ostatnie polecenia vi do edycji określonego pliku, a następnie chcę ponownie użyć jednego z nich do edycji tego samego pliku, ale z innym rozszerzeniem.

$ hg variables
 6153  vi Variables/user-extensions.js 
 6176  vi Variables/user-extensions.js 
 6178  vi Variables/user-extensions.js 
 6190  vi Variables/user-extensions.js 
 6230  hg variables
$ # Notice the difference in case with V and v is ignored
$ !6190:p
vi Variables/user-extensions.js 
$ ["up-arrow"]
$ vi Variables/user-extensions.[now change .js to .html]

Definiuję również hga(„History Grep All”), aby przeszukiwać całą moją historię:

$ alias hga
alias hga='history | grep -i'

ale nie używam go zbyt często, ponieważ moja historia jest (celowo) bardzo duża i otrzymuję zbyt wiele danych wyjściowych, które później wpływają na przewijanie stron przez terminal.

Michael Durrant
źródło
2
Pamiętaj, że hgjest to również CLI Mercurial .
usandfriends 10.10.2015
1
Dobra notatka Dodano do odpowiedzi.
Michael Durrant
12

Wciśnięcie Ctrl+ R(czyli powiązania klawisza emacsa z wyszukiwaniem odwrotnym przyrostowym, gdy @gnp poruszał się w komentarzach) w terminalu pozwala na wyszukiwanie w histrory określonego polecenia. Polecenie zostanie wyświetlone i można je edytować przed wykonaniem. Zobaczysz coś takiego:

wprowadź opis zdjęcia tutaj

Źródło

Hamza Abbad
źródło
1
Dzięki! Nie do końca bezpośrednia odpowiedź na moje pytanie, ale nie wiedziałam o tym i uważam ją za bardzo przydatną. Dziękuję Ci bardzo!
Arturas M
1
Warto również zauważyć, że Ctrl + R jest funkcją wyszukiwania wstecznego inkrementalnego Emacsa. Wiele skrótów klawiszowych emacsa działa w wielu narzędziach GNU: Ctrl + A, Ctrl + E, Ctrl + K, Ctrl + Y i innych.
GnP
@gnp Dzięki za informację, nie wiedziałem o tym.
Hamza Abbad
Długo mi zajęło wygodne korzystanie z ctrl-r po nauczeniu się dwóch kluczowych rzeczy. 1. zignoruj ​​wynik podczas pisania. 2. Upewnij się, że wiesz wystarczająco dużo, aby wpisać wystarczająco jednoznacznie dla żądanego polecenia
Michael Durrant
7

fckomenda robi to, co chcesz

fc -l <number> wyświetli historię poleceń wokół tego numeru

fc <number>otworzy ten wiersz wiersza poleceń vim(lub jakikolwiek domyślny edytor, jak przypuszczam), abyś mógł go edytować, a :wqon będzie dostępny dla ciebie ze strzałką w górę.

Sos
źródło
7

W bash następuje Ctl+alt+erozwinięcie powłoki, więc wpisanie, !1255a następnie naciśnięcie tej kombinacji zastąpi bieżącą linię treścią wpisu historii 1255

Adonis
źródło
nie zrobił tego dla mnie na Ubuntu
Michael Durrant
@MichaelDurrant, właśnie próbowałem 14.04 (kubuntu) i działa dla mnie. Jest to udokumentowane man bashjako shell-expand-line. Być może istnieje zestaw skrótów do terminalu gnome.
adonis,
@adonis Nigdy tego nie znałem, dziękuję bardzo, w rzeczy samej spełnia to, o co prosiłem. I rzeczywiście mogę znaleźć więcej zastosowań tej funkcji. Niesamowite! Dzięki!
Arturas M
4

Chcesz użyć polecenia fc podczas określania listy zamiast wykonywania (-l)

fc -ln -1
Miauczeć
źródło