Używając historii basha, aby uzyskać poprzednie polecenie, skopiuj je, a następnie „uruchom”, ale z komentarzem do polecenia


79

Tylko pytanie, aby poprawić swoje bashumiejętności. Zawsze to robię:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

Następnie mogę uruchomić polecenie, które znalazłem, wykonując:

!123

Jednak często chcę to zrobić:

some_long_command1foobar

To znaczy zmień polecenie, zanim je uruchomię. Czy możesz użyć basha, aby zamiast tego uruchomić to polecenie:

#some_long_command1

więc jest komentowany.

Wtedy nie muszę używać myszy, aby podświetlać polecenie, edytować je, a następnie uruchamiać (mogę po prostu użyć klawiatury - szybciej).

Przypuszczam, że mógłbym napisać skrypt, który to zrobi, ale może być już gdzieś wbudowana funkcjonalność ....?


6
Najłatwiej: umieść bind Space:magic-spaceswój profil bash. Następnie naciśnięcie Spacerozwinie się !123do some_long_command1.
Blaz

@courteous: Dzięki! Ten był dla mnie nowy. Bardzo przydatne.
marlar

Odpowiedzi:


140

Sugerowałbym, aby zamiast używać polecenia historii, użyj ctrl+ri zacznij pisać to polecenie. Po naciśnięciu klawisza strzałki, jakbyś chciał go zmodyfikować, wypadnie on z rozpoznawania autouzupełniania i pozwoli ci edytować przed uruchomieniem.

UPDATE: także, jeśli chcesz przełączać się między różnymi poleceniami zawierającymi właśnie wpisany ciąg, naciskaj dalej ctrl+r


8
Jeśli używasz przypisań klawiszy vi ( set -o vi), możesz również użyć /do przeszukiwania historii i jej edycji.
William Pursell

1
Bardziej zaawansowaną funkcją jest umożliwienie wpisania częściowego polecenia lub części ścieżki, która była w poleceniu, a następnie użycie strzałek do poruszania się po historii. Wyszukaj opcje przeszukiwania historii wstecz, przeszukiwania historii do przodu dla bash
DavidC

2
DavidC, widziałem, jak inni to robią, ale dla mnie to nie działa. Kiedy wpisuję kilka pierwszych liter polecenia, następnie naciskam strzałkę w górę, ignoruje to, co piszę i przechodzi przez historię, jakbym w ogóle niczego nie wpisała (od najnowszych do najstarszych). Jak skonfigurujesz swoją powłokę, aby to osiągnąć?
Daniel Watrous

1
To smutne, że góra / dół nie przewija dopasowań, ale natychmiast wychodzi z wyszukiwania. Wolałbym przewijać dopasowania za pomocą strzałki w górę / w dół (co wskazuje, że wciąż szukam polecenia, którego chcę) i wyjść z wyszukiwania tylko w lewo / w prawo (wskazując, że znalazłem polecenie, które chcę a teraz jestem gotowy do edycji).
ADTC,

3
@ADTC Właśnie znalazłem sposób na zrobienie tego, co ty (i ja) chcesz: naciśnij ctr+r, zacznij pisać, a jeśli chcesz znaleźć wszystkie polecenia, które to zawierają, po prostu naciskaj ctrl+r. Innymi słowy, to, co chcesz zrobić z górę / w dół, jest wykonywane (w sposób okrężny) za pomocąctrl+r
Miquel

61

Właściwie możesz po prostu dołączyć :pdo polecenia, aby je wydrukować bez faktycznego uruchamiania. Na przykład:

$ ls -la
$ !!:p

Zostanie wydrukowane ls -lajako poprzednie polecenie bez uruchamiania go i możesz po prostu nacisnąć (w górę), aby je znaleźć i edytować.

Ty też możesz to zrobić

!123:p

wydrukować 123. polecenie jako poprzednie polecenie.


2
+1 Najlepszą odpowiedzią, ponieważ umożliwia zwykłe polecenia historii, aby odpowiedzieć na OP: !mycmd:p. Jeśli masz włączone polecenia vi w Bash, odpowiedź Pursella jest równie dobra lub lepsza. Ctrl-r, jak wspomniał Miquel, jest następny w kolejności.
Brent Faust

Jeśli 123 nie jest na początku linii, możesz zrobić:!? 123?: P
Udi

19

Możesz także spróbować fcpolecenia polecenie, aby edytować polecenie w historii.

WIKI mówi:

fc to standardowy program na Uniksie, że listy lub edycje i reexecutes polecenia uprzednio wprowadzone do interaktywnego powłoki. fc to polecenie wbudowane w powłokę bash ; help fc pokaże informacje o użytkowaniu.


Oprócz wyszukiwania wstecznego ( Ctrl+ R), mamy jeszcze kilka skrótów bash :

Od man bash:

poprzednia historia (Cp)
    Pobierz poprzednie polecenie z listy historii, cofając się na liście. 
następna historia (Cn)
    Pobierz następne polecenie z listy historii, przechodząc do przodu na liście. 
początek-historii (M- <)
    Przejdź do pierwszej linii w historii. 
koniec historii (M->)
    Przejdź na koniec historii wprowadzania, tj. Do aktualnie wprowadzanej linii. 
reverse-search-history (Cr)
    Przeszukuj wstecz, zaczynając od bieżącego wiersza i przechodząc „w górę” przez historię, jeśli to konieczne. To jest wyszukiwanie przyrostowe.
forward-search-history (Cs)
    Szukaj do przodu, zaczynając od bieżącego wiersza i przechodząc „w dół” przez historię, jeśli to konieczne. To jest wyszukiwanie przyrostowe.
non-Incremental-reverse-search-history (Mp)
    Przeszukuj historię do tyłu, zaczynając od bieżącego wiersza, używając nie przyrostowego wyszukiwania ciągu dostarczonego przez użytkownika. 
nie-przyrostowa-historia-wyszukiwania-do-przodu (Mn)
    Przeszukuj historię w przód, używając nieinkrementalnego wyszukiwania ciągu dostarczonego przez użytkownika.
yank-nth-arg (MCy)
    Wstaw pierwszy argument do poprzedniego polecenia (zwykle drugie słowo w poprzednim wierszu) w punkcie. Z argumentem n wstaw n-te słowo z poprzedniego polecenia (słowa w poprzednim poleceniu zaczynają się od słowa 0). Ujemny argument wstawia n-te słowo z końca poprzedniego polecenia. Po obliczeniu argumentu n argument jest wyodrębniany tak, jakby zostało określone rozwinięcie historii „! N”.
yank-last-arg (M-., M-_)
    Wstaw ostatni argument do poprzedniego polecenia (ostatnie słowo poprzedniego wpisu historii). Z argumentem zachowuj się dokładnie tak, jak yank-nth-arg. Kolejne wywołania yank-last-arg przechodzą z powrotem przez listę historii, wstawiając po kolei ostatni argument każdej linii. Narzędzia do rozwijania historii są używane do wyodrębniania ostatniego argumentu, tak jakby zostało określone rozwinięcie historii „! $”.
shell-expand-line (MCe)
    Rozwiń linię tak, jak robi to powłoka. Spowoduje to rozwinięcie aliasów i historii, a także wszystkich rozwinięć słów powłoki. Zobacz ROZSZERZENIE HISTORII poniżej, aby zapoznać się z opisem rozszerzenia historii.
linia-rozwijania-historii (M- ^)
    Wykonaj rozwinięcie historii w bieżącej linii. Zobacz ROZSZERZENIE HISTORII poniżej, aby zapoznać się z opisem rozszerzenia historii.
wstaw-ostatni-argument (M-., M-_)
    Synonim yank-last-arg. 
operuj i zdobądź następny (Co)
    Zaakceptuj bieżącą linię do wykonania i pobierz następną linię względem bieżącej linii z historii do edycji. Każdy argument jest ignorowany.
polecenie-edycji i wykonania (C-xC-e)
    Wywołaj edytor w bieżącym wierszu poleceń i wykonaj wynik jako polecenia powłoki.

11
!123:gs/old/new/

Uruchomi polecenie 123, zastępując ciąg „stary” ciągiem „nowy”.


6

Możesz przejść do trybu edycji, naciskając M- ^ (opcja-shift-6 na komputerze Mac).

Wpisz to:

! 123M- ^

Będziesz edytować polecenie # 123. To trochę tak, jak przy użyciu ctrl-r, ale zaczynając od składni wykrzyknika.


Czy M-^można ponownie powiązać z czymś bardziej przyjaznym dla palców?
Blaz

4

Zamiast korzystania z historypolecenia wiążą history-search-backward/ history-search-forwarddo skrótów klawiszowych, które mogą być zapamiętane łatwo (wolę przód / PgDown). Aby to zrobić, umieść to w swoim .inputrcpliku:

"<key code>":  history-search-backward
"<key code>":  history-search-forward

Aby dostać <key code>, typ Ctrl-V <key>w skorupkach, i zastąpić rozruch ^[ze \ew cokolwiek było wyjścia.

Po skonfigurowaniu możesz po prostu wpisać somei nacisnąć PgUp, aby uzyskać some_long_command. Jeśli potrzebujesz, some_long_command with_some_argale jest podobne polecenie some_long_command with_some_other_argpóźniej w historii, możesz przechodzić między nimi, aż do niego dotrzesz, wpisując, somea następnie naciskając wielokrotnie PgUp, lub możesz pisać some, naciśnij PgUp, przesuń kursor do miejsca, w którym dwie komendy zaczynają się różnić wpisz kilka znaków i jeszcze raz naciśnij PgUp. Ta możliwość szybkiego przewijania stron / rozróżniania podobnych poleceń sprawia, że ​​moim zdaniem jest to znacznie wygodniejsze narzędzie niż Ctrl-R.


3

Możesz również umieścić

shopt -s histverify

w twoim .bash_profile, co powoduje, że każde rozwinięcie historii pojawia się w linii poleceń bez uruchamiania go, umożliwiając edycję przed wykonaniem tego.


1

Możesz spróbować historii podobnej do "pola sugestii" https://github.com/dvorka/hstr - czyta historię Bash i pozwala na szybką nawigację.

hh

Aby uzyskać ostatnie polecenie, po prostu wpisz hh, przejdź do polecenia i użyj strzałki w prawo, aby uzyskać je w wierszu poleceń (gdzie możesz je edytować i / lub dodać komentarz).



0

Położyć

alias r = 'fc -s'

w swoim .bashrc(domowym katalogu), możesz po prostu wpisać

r <whatever>

w wierszu polecenia i wykonasz kopię ostatniego <whatever>polecenia (te same parametry), które znajduje się w historii. po prostu naciśnij strzałkę w górę, aby zobaczyć, co wykonałeś, jeśli poczujesz taką potrzebę.

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.