Wie kann ich mich effizient in der Bash-Befehlszeile bewegen?

19

Also benutze ich das upin meiner Shell (meistens Bash unter OSX oder Ubuntu), aber manchmal weiß ich, dass ich das Zeug nach der aktuellen Position des Cursors haben möchte . Gibt es eine Möglichkeit, die Zeile, in der ich mich befinde, mit der obigen Zeile zu vervollständigen ? Schlagen upund dann leftnerven.

Irgendwelche anderen Tricks wären auch cool, außer dem tab, worüber wir jetzt alle reden :)

Hier ist ein Beispiel (per ~ quack's Anfrage):

Ich tippe mkdir /where/the/hell/is/that/thingund dann möchte ich in das gleiche Verzeichnis cd. Aber jetzt weiß ich über Meta-B :)

Dan Rosenstark
quelle
1
Ein explizites Beispiel wäre fantastisch.
Quack Quijote
@ ~ Quack macht gerade ein Beispiel
Dan Rosenstark
1
hier ist ein Zusammenhang (dupliziert) Frage, mit einer recht netten Antwort: superuser.com/questions/124336/...
cregox

Antworten:

11

Versuche dies:

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

Drücken Sie dann alt+.

je nach Betriebssystem und Endgerät angezeigt werden müssen , könnte escdann.

Sie können auch alt+ 1+ drücken ., um ein bestimmtes vorheriges Argument auszuwählen.

Das ist viel besser als !! oder! $, weil Sie tatsächlich sehen können, was Sie gerade ausführen, und es trotzdem weniger Tastatureingaben erfordert.

edit: genau genommen ist es das metanicht alt, daher funktioniert es möglicherweise auch mit der "Windows" -Taste, abhängig davon, wie Ihre Tastatur eingerichtet ist.

user23307
quelle
interessant! Davon wusste ich nichts.
Quack Quijote
2
@justin das ist genial. Unter OSX ist Meta Flucht.
Dan Rosenstark
@yar mit OS X Terminal gibt es auch eine Voreinstellung unter "Einstellungen" -> "Tastatur", um "Option als Metataste verwenden".
ThomasW
Danke @ThomasW Ich muss auf dieses Zeug zurückkommen. Ich bin täglich auf der Kommandozeile, benutze aber sehr wenig der Tricks.
Dan Rosenstark
28

Sie sollten man bash auf Ihrem System durchlesen , insbesondere den Abschnitt über Readline , da dies der interaktive Eingabemechanismus von bash ist. Das Bash-Handbuch auf gnu.org enthält einen schönen Abschnitt über die Befehlszeilenbearbeitung , mit dessen Hilfe einige Lücken geschlossen werden können.

Standardmäßig können Sie diese verwenden, um sich in der Befehlszeile zu bewegen (hier nur einige; eine vollständige Liste finden Sie unter dem Link):

  • Ctrl+ aspringt an den Zeilenanfang (oder Homeabhängig von den Terminaleinstellungen)
  • Ctrl+ ebewegt sich an das Ende der Zeile (oder End...)
  • Meta+ fbewegt ein "Wort" vorwärts
  • Meta+ bbewegt ein "Wort" zurück

Sie können diese verwenden, um Text aus einer Zeile zu "töten" (auch "ausschneiden") :

  • Ctrl+ ktötet ("schneidet") Text von der aktuellen Cursorposition bis zum Zeilenende
  • Ctrl+ yyanks ("fügt") den zuletzt getöteten Text in den Puffer am Cursor ein

Sie können diese also kombinieren, um einen Teil einer Befehlszeile auszuwählen, die Sie wiederholen möchten, töten und dann bis zum Ende Ihres nächsten Befehls einfügen.


Lassen Sie uns nun die History-Erweiterung von bash betrachten, damit es noch mehr Spaß macht . Dies ist, !!was Studer in seiner Antwort erwähnt . Die Verlaufserweiterung gliedert sich in Ereignisbezeichner , Wortbezeichner und Modifizierer .

Event- Bezeichner sehen so aus (siehe auch hier die Links für die vollständige Liste):

  • ! - Startet eine Historiensubstitution
  • !n- der n-te Befehl in der Bash-History-Liste für eine ganze Zahl n (funktioniert auch für Negative)
  • !!- der vorhergehende Befehl; gleichwertig!-1
  • !string- Der letzte Befehl, der mit string beginnt

Wortbezeichner wählen bestimmte Teile aus einem Ereignis aus. Verwenden Sie :diese Option , um das Ereignis vom Wortbezeichner zu trennen. Wörter werden beginnend am Zeilenanfang von 0 an nummeriert und durch einzelne Leerzeichen getrennt in die aktuelle Zeile eingefügt.

  • $- bezeichnet das letzte Argument (zB !!:$ist das letzte Argument des letzten Befehls; kann abgekürzt werden !$)
  • n- bezeichnet das n-te Wort (zB !str:2ist das 2. Argument des letzten Befehls beginnend mit str ; !!:0ist der Befehl des letzten Befehls)

Wenn Ihr letzter Befehl also ausgeführt wird mkdir /some/really/long/path, um Ihrem Beispiel !!nachzugehen, wird dieser Befehl erneut ausgeführt. Aber Sie möchten cdstattdessen in diesen Pfad einsteigen:

$ cd !$

Nehmen wir nun an, Sie führen einige andere Befehle aus und möchten dann wieder auf diesen Pfad verweisen. Wenn dies der letzte mkdir- Befehl war, den Sie ausgeführt haben, können Sie diesen Pfad wiederholen:

$ tar czf ~/foo.tgz !mkdir:$
Quacksalber
quelle
Sie können diese (und andere Readline-Befehle) auch an beliebige Tastenkombinationen binden . siehe Abschnitt 8.4 des Handbuchs, Bindbare Readline-Befehle: gnu.org/software/bash/manual/… und Abschnitt 8.3, Readline-Init-Datei: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
Quack Quijote
Danke, das hilft wirklich. Obwohl "read the manual" zu erwarten war, hilft es, wenn man die grundlegenden Bindungsbewegungen erwähnt. Selbst wenn Sie Strg + A kennen, können Sie echte Einsparungen erzielen.
Dan Rosenstark
@ Quack, kein Problem, ich habe eine spätere Revision erwischt, in der Tat :)
Dan Rosenstark
1
beachten Sie auch , bind -poder bind -PIhre aktuelle keybindings drucken; Das ist die ultimative Referenz für das, was Ihre Bash verwendet.
Quack Quijote
1
Ich denke, diese Antwort ist gewachsen: Das Material zur History Expansion ist großartig.
Dan Rosenstark
6

Wenn Sie ein vi-Benutzer sind, können Sie die Shell durch Eingabe in den vi-Modus versetzen set -o vi.

Nach der Eingabe können Sie auf der Befehlszeile alle möglichen wichtigen Aktionen ausführen Esc + k.

Am häufigsten verwende ich Esc+Kdann /Text, der nach dem Schrägstrich eingegeben wird, um den Befehlszeilenverlauf zu durchsuchen.

zB Esc + k /smbclient gibt den letzten smbclient Befehl aus, den Sie eingegeben haben. Sie können mit den Standard-Tasten vi durch alle Suchanfragen scrollen ( jund knach oben und unten, aber ich denke, die Pfeile nach oben und unten funktionieren auch).

Weitere Hilfe hier , es gibt auch einige eingebaute Bash-Dinge an diesem Link, die mehr sein könnten, wonach Sie suchen.

Prost, Stu.

Stuart Brock
quelle
Während der vi-Modus für mich nutzlos ist, ist die l-Tinte fantastisch, da ich noch nicht auf vi aufgestiegen bin. Dank dafür!
Dan Rosenstark
1
Das Äquivalent ohne vi-Modus ist ctrl-r. Geben Sie es ein und dann einen Teil eines vorherigen Befehls. Es wird das letzte Vorkommen dessen angezeigt, was getippt wurde. Drücken Sie erneut Strg-R, um zum nächsten zu gelangen. Sehr praktisch.
Nerdfest
3

Sie können verwenden, !!welches den letzten Befehl darstellt:

% Prüfung
% echo !!
> testen
Studer
quelle
interessant. Ich bin mir nicht sicher, ob ich diesen String dann mit ... was manipulieren möchte?
Dan Rosenstark
Dies ist Teil der History-Funktionen von bash: gnu.org/software/bash/manual/… .. insbesondere die History-Erweiterung: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note !!ist ein Synonym für !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote
2
Dies ist sehr nützlich, wenn Sie vergessen haben, sudo zu verwenden: dh sudo !! - $ more / etc / sudoers / etc / sudoers: Erlaubnis verweigert $ sudo !! sudo mehr / etc / sudoers [sudo] Passwort für ..: # / etc / sudoers ... ... ...
user9632
@wookiebreath, danke dafür, ich werde diese Antwort jetzt abstimmen
Dan Rosenstark
0

Verwenden Sie in dem von Ihnen angegebenen Beispiel! $, Um den letzten Parameter des vorherigen Befehls darzustellen:

mkdir / irgendwas / irgendwas

cd! $

Sie können auch nummerierte Variationen verwenden, um bestimmte Parameter früherer Befehle abzurufen.

Nerdfest
quelle
0

Ich fand vor kurzem dieses readline Spickzettel sehr nützlich. Viele Dinge, die ich nicht wusste. Früher habe ich die !$ganze Zeit verwendet, bis ich etwas über Alt+ herausgefunden habe ., das ich jetzt die ganze Zeit verwende. :)

Fred
quelle