Czy istnieje sposób wykonywania poleceń z historii?


99

Na przykład:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

Zastanawiam się tylko, czy jest jakiś sposób na wykonanie polecenia 636 bez ponownego wpisywania, wystarczy wpisać coś plus liczbę, na przykład historię 636 lub coś takiego.



1
Tak, wiem o tym, ale nie do końca tego chcę.
The One

Odpowiedzi:


170

W bashu !636wszystko będzie dobrze.


12
In Linux- Ma to więcej wspólnego z powłoką (bash, zsh itp.), Z której korzysta osoba, a nie z systemem operacyjnym, na którym jest uruchomiona. Na Linuksie są powłoki bez obsługi historii.
Zoredache

@Zoredache I podobnie działa to dobrze w większości implementacji bash w systemie Windows.
Ajedi32

1
Oczywiście nie tylko bash, ale także inne powłoki - w tym csh.
Drew

5
Jeśli masz polecenie, które jest bardzo podobne do tego, co chcesz uruchomić, możesz na przykład dołączyć :ppolecenie drukowania polecenia bez uruchamiania !636:p. Co oznacza, że ​​możesz łatwo wybrać go ponownie ze swojej historii, naciskając strzałkę w górę i wprowadzić niewielkie zmiany, które chcesz
AJefferiss 14.04.16

78

Tak, nazywa się to „ekspansją historii”. Widzieć

LESS='+/^HISTORY EXPANSION' man bash

dla pełnych szczegółów.

Użycie wykrzyknika, po którym następuje liczba, jest prawdopodobnie najprostszym zastosowaniem:

!636

Możesz jednak uruchomić bezpośrednio ostatnie polecenie, nie znając jego numeru historii:

!!

Lub możesz uruchomić dwa polecenia z powrotem:

!-2

Najczęściej jednak używam formy, aby powtórzyć ostatni argument ostatniego polecenia:

echo this text goes into a file > /tmp/afile.txt
cat !$

Lub powiedzmy, że sprawdzam plik. Korzystając z uzupełniania tabulatorów, mogę wykonać następujące czynności:

ls -l /really/long/path/to/some/file
less !$

Ponownie przeczytaj stronę podręcznika, aby uzyskać więcej informacji:

LESS='+/^HISTORY EXPANSION' man bash

25
Interaktywnie Alt-.może być wygodniejszy niż !$. Wstawia ostatni wiersz ostatniego polecenia dosłownie do wiersza.
ulidtko

2
@ulidtko Gdzie są udokumentowane te specjalne ucieczki (o których wiedziałem !$, ale nigdy nie słyszałem Alt-.)? Czy podasz link do niego?
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. Wiele programów oprócz bash używa libreadline; dla tych, którzy, masz te same cechy jak Alt-., Ctrl-X-U(Usuń), Ctrl-/(skrót opisu), tab-completion, etc - za darmo. Na przykład, z zaledwie trzy linie z PYTHONSTARTUPjednego można włączyć kartę uzupełniania i historię w REPL Zdjęcie Pythona . Który będzie działał (głównie) tak samo jak w bash, ponieważ działa biblioteka GNU Readline. Strona readline opisuje szczegółowo funkcje.
ulidtko

2
Również Ctl-UpArrow (lub AltUpArrow w bash) przewinie listę historii do tyłu. Wpisując kilka znaków, UpArrow pobiera tylko polecenia zaczynające się na tę literę, np. „Fr (Ctl-Up)” przewija wszystkie polecenia „wolne ...” na liście PO. Działa to również w takich rzeczach, jak gnuplot i gdb, które używają readline.
jamesqf

2
@ Ajedi32, zobacz ostatnią pogrubioną linię w mojej odpowiedzi. :) Prawdę mówiąc, ta odpowiedź to zaledwie przedsmak tego, co może zrobić ekspansja historii . Pamiętaj, że jest to na poziomie powłoki, a nie polecenia, które wołasz; stąd echo {1..5}następnie touch !$ruszy pięć plików, a nie tylko jeden. Mówiąc ściśle, nie jest to ostatni argument, ale ostatnie słowo powłoki w tym wierszu. (Również spróbować echo hello >tempnastępnie echo goodbye !$.) Jeśli można myśleć o sposób, aby umieścić go wyraźniej czuć się swobodnie zasugerować zmienił.
Wildcard

14

Fajny, jeśli nie chcesz najpierw historii, zanotuj numer itp .:

w bash (i może inne):

ctrl-r something 

( ctrl-r= „interaktywnie szukaj wstecz”) ( something= część poprzedniego polecenia)

Spowoduje to wyświetlenie najnowszej linii historii zawierającej something. Aby uzyskać poprzedni, ponownie wykonaj ctrl-r (sam), za każdym razem, gdy pobierze poprzednią linię.

dawny:

ctrl-r  10

aby wyświetlić najnowszą linię historii zawierającą „10” (na przykład linię z $10, w swoim przykładzie) i ctrl-rponownie, dopóki nie odzyskasz poszukiwanej linii historii

Kiedy pojawi się linia chciał, po prostu Entergo uruchomić (lub można także edytować, używając arrow keys, backspacei ctrl-aprzejść do początku wiersza, ctrl-eaby dostać się do końca, ctrl-k: „zabić” od kursora do końca wiersza (= usuwa + zapisuje go w buforze),: ctrl-yaby przywrócić z bufora wcześniej zabity bit itp.)

Jeśli chcesz szukać do przodu (ctrl-s), najpierw musisz wyłączyć XON : patrz https://stackoverflow.com/a/791800/1841533 :

„tylko w celu wyłączenia XON / XOFF przez uruchomienie

stty -ixon

„(i wtedy będziesz mógł używać ctrl-s, bez konieczności zamrażania terminala)


Jeśli to zrobię i przypadkowo naciśniesz ctrl-r jeden raz za dużo, czy jest jakiś sposób na ponowne przeszukanie historii?
kasperd

@kasperd: Tak, możesz. wiele odpowiedzi na to wskazuje: ctrl-s dla wyszukiwania do przodu.
Olivier Dulac

Niestety ctrl-s służy do zamrażania terminala, a bash tego nie wyłącza, więc to nie działa w domyślnej konfiguracji. (Inne programy - takie jak emacs - wyłączają klawisze, aby zamrozić terminal, tak aby można było użyć ctrl-s do wyszukiwania.)
kasperd

@kasperd: Tak, przepraszam, że nie wspominałem o tym wcześniej (wskazałem „wiele odpowiedzi”, ponieważ robią to dokładnie, ale nie poświęciłem czasu na wpisanie tego w komentarzu lub podanie linku ... (użyłem mojego telefon) Teraz wróciłem do domu i mogłem edytować to w powyższej odpowiedzi. ctrl-s do przeszukiwania historii bashów wymaga najpierw stty -ixon
Olivier Dulac

To polecenie przerwie normalne użycie ctrl-s, więc tak naprawdę nie jest to opcja.
kasperd 10.04.16

7

Możesz użyć wbudowanej powłoki fc :

fc -s 636

2
To jest rzeczywiście lepsze niż zaakceptowana odpowiedź, ale musisz usunąć, -saby uzyskać korzyści. Jeśli uruchomisz fc 636, otworzysz w buforze edytor z poleceniem 636 z twojej historii, a kiedy zapiszesz i wyjdziesz, polecenie (zmodyfikowane lub nie) zostanie uruchomione. Co więcej, ten jest zgodny z POSIX .
Wildcard

@StevenPenny Thanks. I tak, wiem, czym jest POSIX, chociaż nie widzę znaczenia. Niezależnie od tego fajna byłaby łatwo dostępna i dołączona dokumentacja.
Faheem Mitha,

@FaheemMitha spróbuj uruchomić „help fc”.
Wildcard

@Wildcard helpnie jest POSIX - być może będzie musiał zrobić coś man dashpodobnego
Steven Penny

@Wildcard Thanks. Zwykle zapominam o helpistnieniu. Kolejna wbudowana powłoka. Zastanawiające dla nieostrożnych użytkowników, którzy mogą potrzebować pomocy w nowym systemie, ale zamiast tego stają w obliczu bełkotu. :-(
Faheem Mitha

3

Istnieje HSTR- hhkomenda bashi zshinteraktywny wybór komend, lepszy niż wyszukiwanie do tyłu Ctrl-R:

hh przykład komendy historii interaktywnej

jest interaktywny, dzięki czemu można wyszukiwać i edytować polecenie przed jego wykonaniem.

W systemie Ubuntu można zainstalować hhza pomocą następującego linera:

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

lub krok po kroku:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

Zainstaluj hhna Fedorze, RHEL lub CentOS:

sudo dnf|yum install hstr -y

Na macOS z homebrew:

brew install hh

... a następnie skonfiguruj za pomocą:

hh --show-configuration >> ~/.bashrc

Zastąpi to domyślne zachowanie Ctrl-R.

Uruchom, hh --show-configurationaby określić, co zostanie dołączone do Twojego profilu Bash.

Więcej opcji konfiguracji dostępnych na stronie głównej projektu w Github: https://github.com/dvorka/hstr

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.