W systemach UNIX możesz naciskać górne i dolne strzałki, aby poruszać się po poprzednich poleceniach. Jest to bardzo przydatne.
Czasami wchodzę na górę i znajduję polecenie, którego chcę użyć ponownie, ale z pewnymi zmianami. Jeśli dokonam takich zmian, nie będę mógł odzyskać oryginalnej komendy, chyba że ją sprawdzę history
.
Czy istnieje sposób „cofnięcia” zmian polecenia w historii, do której dostęp uzyskuje się za pomocą klawiszy?
Moje obecne obejście polega na dodaniu #
polecenia a do polecenia. W ten sposób bieżące polecenie jest wykonywane jako komentarz, więc nic się nie dzieje. Następnie mogę ponownie przeglądać polecenia za pomocą klawiszy. Problem polega na tym, że polecenie, którego użyłem, może być bardzo odległe na liście, więc wznowienie gry dwieście razy to trochę. Control + R też nie jest rozwiązaniem, ponieważ mogę nie pamiętać dokładnie tego, czego szukałem.
Przykład
Wpisałem następujące „50 poleceń temu”:
ls -l /etc/httpd/conf/
Teraz podszedłem do tej linii i zmieniłem ją na
ls -l /etc/init.d/
ale nie nacisnął Enter. Teraz chcę przejść do tego ls -l /etc/httpd/conf/
ponownie.
Moje środowisko
$ echo $SHELL
/bin/bash
$ echo $TERM
xterm
źródło
ksh
przykład możesz edytować wpisy historii i wywoływać je bez usuwania „poprzedniej wersji” wpisu; masz wszystkie wywołane polecenia dostępne.ksh
Wygląda na to, że również w tym przypadku zachowanie się tu różni. A opcje edycji historii zależą również od wybranego trybu edycji. Naksh
przykład w trybie vi stary wpis nie jest nadpisywany, a także mogę wydać polecenie cofnięcia, podobnie jak wvi
, za pomocą „u”.ksh
, ale dobrze wiedzieć, że coś takiego istnieje.Odpowiedzi:
Tak długo, jak edytowałeś pozycję historii, ale Enterjeszcze nie nacisnąłeś , aby wrócić do pierwotnej pozycji, kilkakrotnie naciśnij Ctrl+ _-
undo
polecenie - aż nie spowoduje to dalszych zmian. Wróciłeś do pierwotnego wpisu.źródło
Powróć do pierwotnego polecenia po wprowadzeniu wielu zmian w wierszu:
M
jest meta-kluczem, który jest altrdla mnie.Darmowe, ale pomocne informacje
Kiedy już wykonana komenda OP jak wcześniej zrobił (zdarza się), nie ma nic do „Cofnij”, ponieważ polecenia są obsługiwane i zapamiętanego przez GNU readline biblioteki i nie jest napisane do
$HISTFILE
momentu wyjścia powłoki. Powodem, dla którego o tym wspominam, jest to, że nie można po prostugrep
tego$HISTFILE
oczekiwać, a wyjście z powłoki może nie być idealne.Oto kilka opcji, które pozwolą Ci uniknąć przewijania wszystkich poprzednich poleceń readline.
Jeśli pamiętasz niektóre polecenia , naciśnij ctrl+ ri wpisz, co pamiętasz, aby przeszukać poprzednie polecenia zawierające ten ciąg. Ponowne naciśnięcie ctrl+ rspowoduje wyświetlenie następnego najnowszego, wyszukiwania do tyłu.
Na przykład wpisz
ls -l
następnie ctrl+ rtyle razy, ile potrzeba, aby znaleźć poprzednie polecenie, którego szukasz. Jeśli przejdziesz obok tego, ctrl+ sprzeszuka do przodu od bieżącej pozycji.fc
Bash wbudowane polecenia jest pomocne notować numery indeksów obok poprzednich poleceń readline.fc -l -100
wyświetli listę 100 poprzednich poleceń w trybie readline.Dodatkowo, jeśli OP wie, że szuka poprzedniego
ls -l
polecenia, może przesłać dane wyjściowe dogrep
:fc -l -100 | grep 'ls -l'
Powinno to spowodować wyświetlenie listy poprzednich
ls -l
poleceń poprzedzonych numerem indeksu. Dane wyjściowe wyglądają następująco:2065 ls -l
Teraz możesz użyć oznaczenia zdarzenia, w
!n
którymn
znajduje się numer indeksu. W tym przykładzie wykonywanie!2065
zostanie rozwinięte dols -l
.Chociaż po tym nie pomaga, każdy, kto chce zachować najnowszą historię poleceń podczas modyfikowania poprzednich poleceń, powinien zapoznać się z
HISTORY EXPANSION
sekcjąman bash
. Oto kilka alternatywnych metod modyfikowania starych poleceń bez nadpisywania historii.W tej
Event Designators
sekcji pokazano, jak łatwo edytować ciąg znaków za pomocą ostatnio używanego polecenia.Przykład:
Najnowsze polecenia będą teraz wyświetlać:
W powyższym przykładzie wyjaśniono również, jak używać
sed
zamieniać ciąg w desygnatorze zdarzenia.Jeśli więc w historii
echo foo
pojawią się 3 polecenia , użyjesz:!-3:s/foo/bar
Zwróć uwagę, że w tym przypadku oznaczenia zdarzeń pojawią się w Twojej historii po wykonaniu polecenia
echo bar
. Nie pojawi się w historii jako!-3:s/foo/bar
.Po prostu wyrzucam to, ponieważ wydaje się to ściśle powiązane, nawet jeśli jest to bardziej „nie rób” niż rozwiązanie „cofnij”, którego szuka OP.
źródło