Jak efektywnie poruszać się po linii poleceń bash?

19

Używam więc upw mojej powłoce (głównie Bash na OSX lub Ubuntu), ale czasami wiem, że chcę rzeczy po bieżącej lokalizacji kursora. Czy jest jakiś sposób na uzupełnienie linii, którą mam na linii powyżej? Uderzenie, upa następnie leftjest denerwujące.

Wszelkie inne sztuczki też byłyby fajne, z wyjątkiem tych tab, o których wszyscy teraz wiemy :)

Oto przykład (na żądanie kwakra):

Piszę, mkdir /where/the/hell/is/that/thinga następnie chcę cd do tego samego katalogu. Ale teraz wiem o meta-b :)

Dan Rosenstark
źródło
1
wyraźny przykład byłby niesamowity.
quack quixote
@ ~ szarlatan robi teraz przykład
Dan Rosenstark
1
oto powiązane (zduplikowane) pytanie, z całkiem niezłą odpowiedzią: superuser.com/questions/124336/…
cregox

Odpowiedzi:

11

Spróbuj tego:

mkdir /where/the/hell/is/that/thing

następnie naciśnij alt+.

w zależności od systemu operacyjnego i zacisk może trzeba wpisać escnastępnie.

Możesz także nacisnąć alt+ 1+, .aby wybrać konkretny poprzedni argument.

To jest o wiele lepsze niż !! lub! $, ponieważ faktycznie możesz zobaczyć, co masz zamiar uruchomić, i to i tak wymaga mniejszej liczby naciśnięć klawiszy.

edit: ściśle mówiąc to metanie alt, więc może także współpracować z klawisza „Windows” w zależności od tego, jak klawiatura jest ustawiony ..

użytkownik23307
źródło
ciekawy! nie wiedziałem o tym.
szarlatan
2
@ justin to jest niesamowite. W OSX meta to escape.
Dan Rosenstark,
@yar z terminalem OS X Istnieje również ustawienie preferencji w „Ustawienia” -> „Klawiatura”, aby „użyć opcji jako klawisza meta”.
ThomasW
Dzięki @ThomasW Muszę wrócić do tych rzeczy. Codziennie korzystam z linii poleceń, ale używam bardzo mało sztuczek.
Dan Rosenstark
28

Powinieneś przeczytać man bash w swoim systemie, szczególnie sekcję Readline , ponieważ jest to interaktywny mechanizm wprowadzania bash. Podręcznik Bash na gnu.org zawiera przyjemną sekcję dotyczącą edycji wiersza poleceń , która pomoże wypełnić niektóre luki.

Domyślnie możesz ich użyć do poruszania się po linii poleceń (wystarczy wymienić kilka tutaj; zobacz link do pełnej listy):

  • Ctrl+ aprzesuwa się na początek linii (lub w Homezależności od ustawień terminala)
  • Ctrl+ eprzesuwa się na koniec linii (lub End...)
  • Meta+ fprzesuwa „słowo” do przodu
  • Meta+ bprzesuwa do tyłu „słowo”

Możesz ich użyć do „zabicia” (aka „wycięcia”) tekstu z linii:

  • Ctrl+ kzabija („wycina”) tekst od bieżącej pozycji kursora do końca linii
  • Ctrl+ yyanks („wkleja”) ostatnio zabity tekst z powrotem do bufora kursora

Możesz więc połączyć je, aby wybrać fragment linii poleceń, który chcesz powtórzyć, zabić go, a następnie wkleić na końcu następnego polecenia.


Teraz, aby było jeszcze przyjemniej, rozważmy rozszerzenie historii bash . Oto, o !!czym wspomina Studer . Przerwy dylatacyjne historia dół do oznaczników zdarzeń , oznaczników słownych i modyfikatorów .

Oznaczniki zdarzeń wyglądają tak (ponownie, zobacz linki do pełnej listy):

  • ! - rozpoczyna podstawianie historii
  • !n- n-ta komenda na liście historii basha, dla niektórych liczb całkowitych n (działa również na negatywy)
  • !!- poprzedzające polecenie; równoważny!-1
  • !string- najnowsza komenda zaczynająca się od łańcucha

Projektanci słów wybierają określone części ze zdarzenia. Użyj, :aby oddzielić zdarzenie od desygnatora słowa. Słowa są ponumerowane od 0, zaczynając od początku linii, i wstawione do bieżącej linii oddzielone pojedynczymi spacjami.

  • $- wyznacza ostatni argument (np. !!:$jest ostatnim argumentem ostatniego polecenia; można go skrócić !$)
  • n- oznacza n-ty wyraz (np. !str:2jest drugim argumentem najnowszego polecenia rozpoczynającego się od str ; !!:0jest poleceniem ostatniego polecenia)

Tak więc, aby śledzić twój przykład, jeśli twoje ostatnie polecenie jest mkdir /some/really/long/path, wystarczy uruchomić !!ponownie polecenie. Ale cdzamiast tego chcesz przejść na tę ścieżkę:

$ cd !$

Powiedzmy teraz, że wykonujesz inne polecenia, a następnie chcesz ponownie powrócić do tej ścieżki. Jeśli to było ostatnie polecenie mkdir, które uruchomiłeś, możesz użyć tego, aby powtórzyć tę ścieżkę:

$ tar czf ~/foo.tgz !mkdir:$
quack quixote
źródło
możesz także powiązać te (i inne polecenia Readline) z dowolnymi kombinacjami klawiszy; patrz sekcja 8.4 instrukcji, Bindable Readline Commands: gnu.org/software/bash/manual/... i sekcja 8.3, Readline Init File: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote
dzięki, to naprawdę pomaga. Chociaż można było się spodziewać „przeczytania instrukcji”, wspomnienie podstawowego poruszania się po wiązaniach pomaga. Nawet sama znajomość ctrl-a może być prawdziwą oszczędnością.
Dan Rosenstark
@ quack, nie ma problemu, złapałem późniejszą wersję, w rzeczywistości :)
Dan Rosenstark
1
również zanotuj bind -plub bind -Pwydrukuje twoje obecne skróty klawiszowe; to ostateczne odniesienie do tego, czego używa twoja bash .
szarlatan
1
Myślę, że ta odpowiedź wzrosła: rzeczy z History Expansion są świetne.
Dan Rosenstark,
6

Jeśli jesteś użytkownikiem vi, możesz przełączyć powłokę w tryb vi, pisząc set -o vi.

Następnie możesz pisać różnego rodzaju potężne rzeczy w wierszu poleceń po wpisaniu Esc + k.

Z którego korzystam najczęściej jest Esc+Knastępnie /dowolny tekst wpisany po ukośnik będzie używany do przeszukiwania historii wiersza poleceń.

np. Esc + k /smbclient poda ostatnie wpisane polecenie smbclient. Możesz przewijać wszystkie wyszukiwania za pomocą standardowych klawiszy vi ( ji kdo góry i na dół, ale myślę, że strzałki w górę i w dół też będą działać).

Dalsza pomoc tutaj , jest też kilka wbudowanych bashów pod tym linkiem, które mogą być bardziej tym, czego szukasz.

Na zdrowie, Stu.

Stuart Brock
źródło
podczas gdy tryb vi jest dla mnie bezużyteczny, ponieważ nie podszedłem jeszcze do vi, tusz l jest niesamowity. Dziękuję za to!
Dan Rosenstark,
1
Odpowiednikiem bez trybu vi jest ctrl-r. Wpisz go, a następnie część poprzedniego polecenia. Spowoduje to ostatnie wystąpienie wpisanego tekstu. Naciśnij ctrl-r ponownie, aby przejść do następnego. Bardzo przydatny.
Nerdfest,
3

Możesz użyć, !!która reprezentuje ostatnie polecenie:

% test
% Echo !!
> test
Studer
źródło
ciekawy. Nie jestem pewien, czy chcę manipulować tym ciągiem za pomocą ... czego?
Dan Rosenstark
jest to część wyposażenia historii basha: gnu.org/software/bash/manual/… .. szczególnie rozszerzenie historii: gnu.org/software/bash/manual/bashref.html#History-Interaction ... notatka !!jest synonimem dla !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
szarlatan Kichot
2
Jest to bardzo przydatne, gdy zapomnisz użyć sudo: tj. Sudo !! - $ more / etc / sudoers / etc / sudoers: Odmowa dostępu $ sudo !! sudo więcej / etc / sudoers [sudo] hasło do ..: # / etc / sudoers ... ... ...
user9632
@wookiebreath, dzięki za to, głosuję teraz na tę odpowiedź
Dan Rosenstark
0

W podanym przykładzie użyj! $ Do przedstawienia ostatniego parametru poprzedniego polecenia:

mkdir / something / somethingelse

cd! $

Możesz także użyć numerowanych odmian, aby wyciągnąć określone parametry poprzednich poleceń.

Nerdfest
źródło
0

Niedawno uznałem ten tekstowy ściągawka za bardzo przydatny. Wiele rzeczy, których nie wiedziałem. Używałem !$cały czas, aż dowiedziałem się o Alt+ ., z którego teraz korzystam cały czas. :)

Fredden
źródło