Z BASH po „przewinięciu” do poprzedniego polecenia… jak przejść do następnego w tej historii?

59

Przepraszam, ten tytuł nie jest najbardziej elegancki, jaki kiedykolwiek wymyśliłem.

Ale zakładam, że wiele osób się nad tym zastanawiało, a moje pytanie może być dupkiem ... mogę tylko powiedzieć, że nie znalazłem.

Kiedy mówię „przewijanie” w górę, mam na myśli użycie klawisza „strzałka w górę” na klawiaturze, który oczywiście przewija cię w górę w historii, zaczynając od ostatniego polecenia.

Więc możesz znaleźć polecenie może 30 poleceń z powrotem ... i uruchom je. A następnie chcesz uruchomić polecenie, które pierwotnie pojawiło się po nim ... czy jest to szybki sposób na zrobienie tego? Lub jak robią to biegli w BASH?

gryzoń mike
źródło

Odpowiedzi:

96

Uruchomienie polecenia za pomocą Ctrl+ ozamiast Enterspowoduje uruchomienie polecenia z historii, a następnie umieszczenie w kolejce następnego zamiast powrotu do przodu historii bash.

Jon Reinhold
źródło
2
Właśnie próbowałem tego we własnej bashie działającej w Xtermie na NetBSD i to nie działa! Czy istnieją ustawienia, które mogą na to wpłynąć? Nie mam pliku .inputrc. Co nie jest wymienione na stronie podręcznika readline (3).
Rhialto
@Rialo Czy korzystasz z viedycji linii (włączone za pomocą set -o vi) czy emacs? Ponieważ Ctrl-O, o ile wiem, nie będzie działać z tym pierwszym.
B Warstwa
... ale to może być usunięte za pomocą polecenia: bind "\C-o":operate-and-get-next(lub dodać wszystko po binddo ~/.inputrc)
B Warstwa
1
Dowiedziałem się, na czym polega mój problem: ^ O jest traktowany jako znak Flush Output (nie obsługiwany w systemie Linux), a readline nie wyłącza go, gdy jest aktywny. Dostarczyłem prostą łatkę, ale opiekun bash i readline utrzymuje, że to nie jest błąd. Nie zgadzam się. Zobacz lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto
19

Odpowiedź Jona Reinholda jest świetna, ale zaproponuję o wiele potężniejsze rozwiązanie. Mam również komentarz na temat gotcha w odpowiedzi Jona, ale nie mam wystarczającej reputacji, aby móc komentować bezpośrednio, więc @Jon Reinhold, jeśli to czytasz, proszę skieruj mój komentarz poniżej.

Bash zawiera polecenie fc, które przyjmuje jako parametry numery linii listy historii bash. Następnie otwiera domyślny edytor z tymi wierszami jako tekstem. W tym momencie możesz opcjonalnie edytować linie. Następnie, po wyjściu z edytora, bash wykonuje te linie!

Przykładem zmiany, którą możesz chcieć wprowadzić, jest dołączenie do wszystkich wierszy, z wyjątkiem ostatniego, czegoś takiego jak „; czytaj -p„ next ... ”. Spowoduje to, że bash wykona każdą linię i wyświetli monit przed kontynuowaniem.

Komentarz dla Jona Reinholda: Świetna odpowiedź, ale powinieneś ją zakwalifikować, ponieważ jeśli użytkownik ustawił zmienną bash HISTCONTROL do włączenia erasedups, to po wykonaniu C-oużytkownik będzie zdezorientowany, ponieważ zamiast oczekiwanej następnej komendy w historii, następna komenda zostanie wyświetlone. Wynika to z faktu, że bash usunął pierwotne wystąpienie wykonanego polecenia, a zatem wszystkie polecenia przesunęły się w górę o jedną linię, tj. do jednego niższego numeru indeksu na liście historii.

użytkownik1404316
źródło
dzięki, próbując znaleźć odpowiedź, szukając, natknąłem się na polecenie „fc”. Dla mnie jest to kolejny etap powolnych kroków małego neofity BASH na ścieżce chwały w kierunku WIEDZY. Chciałem pierwszy krok dziecka.
Mike gryzoni
3
@mikerodent Nie. Tak się dzieje, że fcpoprzedza zarówno siebie, jak Ctl-oi bashsiebie. (W przeciwieństwie do tej odpowiedzi jest on również mniej przydatny).
kubańczyk
1
Problemem erasedupsjest oczywiście błąd bashowy ( mogło istnieć postanowienie na taką sytuację). Ale dobrze wiedzieć.
Alexis
2
@kubanczyk To do debaty. Jeśli jest to złożone, skomplikowane polecenie w zależności od tego, co wymaga naprawy, byłoby znacznie szybciej, gdybym użył mojego edytora do zaktualizowania polecenia. Byłoby również łatwiejsze.
Pryftan
14

Innym sposobem na osiągnięcie pożądanego zachowania byłoby zapoznanie się ze skrótami readash bash (z których CTRL- ojak sądzę) i przeszukiwanie historii bash.

Wyszukiwanie historii

CTRL- rzabierze Cię do wyszukiwania historii poleceń bash, gdzie możesz zacząć wpisywać szukane polecenie, a bash automatycznie wykona polecenie za ciebie. Funkcja autouzupełniania jest naprawdę niezła. Gdy polecenie, które chcesz uruchomić, znajduje się w wierszu wprowadzania, możesz je ENTERuruchomić lub nacisnąć CTRL-, eaby przesunąć kursor na koniec wiersza polecenia i wyjść z trybu wyszukiwania historii.

Fajne z CTRL- ew tym momencie jest to, że bufor historii jest ustawiony kontekstowo do tego polecenia. Następne i poprzednie polecenia są teraz uruchamiane tuż przed i za wierszem, który dla ciebie szukało wyszukiwanie historii. Możesz nacisnąć strzałki w górę lub w dół i złapać następne polecenie.

Wyszukiwanie historii jest bardzo potężne i jest świetnym sposobem na uniknięcie używania strzałki w górę, aby w pierwszej kolejności wrócić do polecenia. Szybkie wyszukiwanie historii może zaoszczędzić dużo czasu na ręcznym przeszukiwaniu historii, a następnie możesz kontynuować CTRL- ojak Jon wskazał powyżej.

Readline Short Cuts

Jeśli chcesz poprawić swój ogólny bash-fu, polecam wypróbowanie skrótów readline dla klawiszy strzałek. Może się okazać, że są one wygodniejsze i pozwalają zwiększyć szybkość pisania, ale oczywiście YMMV. Oto kilka innych:

  1. CTRL- ndla następnego polecenia (odpowiednik strzałki w dół)
  2. CTRL- pdla poprzedniego polecenia (odpowiednik strzałki w górę)
  3. CTRL- bcofnij znak (odpowiednik lewej strzałki)
  4. CTRL- fprzesuń znak (odpowiednik prawej strzałki)

Te skróty do odczytu (wraz z CTRL- apoczątkiem linii i CTRL- ekońcem linii) zwiększą prędkość i wydajność na linii poleceń imo.

111 ---
źródło
2
Nie wiem Uważam, że używanie klawiszy modyfikujących jest wolniejsze niż strzałki lub inne naciśnięcie pojedynczego klawisza. Jeśli chodzi o EOL / itp. Zwykle używam klawiszy home / end (stty -a pokazuje też oczywiście całkiem przydatne rzeczy).
Pryftan
@Pryftan Fair, ostatnie zdanie jest przedstawiane jako opinia (patrz „imo”). Wierzę, że pozostawanie w głównym rzędzie klawiatury na dłuższą metę jest dobrą strategią do pracy w terminalu lub innych intensywnych zadań pisania. Niektórzy ludzie mają klawiatury, w których klawisze strzałek są bliżej innych znaków, w takim przypadku być może skróty readline nie są przekonującą wygodą. Przeredaguję odpowiedź, aby ten ostatni punkt jaśniej wyraził opinię.
111 ---
1
@datUser Tbh ​​Przegapiłem „imo” (lub jeśli tego nie zrobiłem, zaniedbałem to - całkowicie możliwe). Prawdą jest jednak, że wyszukiwanie wsteczne jest przydatne (mieć +1), jeśli działa dla Ciebie. Oczywiście fc jest również czymś (jak już wspomniano) i tak też się używa! (itp.). Wiele sposobów na skórowanie kota w Unices. Jeśli chodzi o klawiatury, to całkiem prawda: mam klawiaturę Unicomp (uwielbiam ją i przywraca wspomnienia), ale oczywiście są też inne klawiatury, o których warto wspomnieć, nie wspominając o Dvorak. W końcu im więcej masz opcji, tym lepiej masz wolne i tym łatwiejsza jest twoja praca (lub zabawa) :)
Pryftan