Was bedeutet! #: 3 in einem Shell-Befehl?

29

In der Installationsanleitung für ack wird vorgeschlagen, das ack-Skript mit folgendem Befehl zu installieren:

curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 

Ich gehe davon aus, dass das !#:3am Ende eine Art Rückverweis ist, aber was bedeutet das? Gibt es ein Äquivalent in zsh? Google war nicht hilfreich.

Matt Pfefferle
quelle
5
Vorausgesetzt, bash; man bash, dann suche nach HISTORY EXPANSION
Jeff Schaller
1
Das bedeutet, dass meine Katze in einer wirklich schlechten Zeit über die Tastatur ging.
IQAndreas
@IQAndreas: Nun, es ist ein gültiger Befehl, also muss Ihre Katze klug genug sein, um den Katzentypisierungsdetektor zu besiegen . Offensichtlich ist dies keine nutzlose Katze. :-) ⁠
G-Man sagt, dass Monica

Antworten:

32

Dies ist eine spezielle Syntax, die um bash erweitert wird. Es funktioniert auch für zsh.

Entsprechend der Bash-Manpage (Abschnitt HISTORY EXPANSION) wird das Muster wie folgt erweitert:

  • Der Event-Bezeichner !# bezieht sich auf die gesamte bisher eingegebene Kommandozeilecurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :Aufteilung zwischen dem Ereignisbezeichner (in diesem Fall die gesamte Zeile) und dem Wortbezeichner (wählt einen Unterteil aus)
  • die Wortkennung 3 , die das auswählt dritte Wort / Argument (Zählen von Worten beginnen bei Null), in diesem Fall ~/bin/ack.

Der letzte Befehlszeile ( in der Regel vor der Ausführung angezeigt) ist: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Einzelheiten finden Sie im bash-Handbuch oder sehr ähnlich im zsh-Handbuch

Jofel
quelle
7
Ich frage mich nur, wer hätte gedacht, dass dieses Feature jemals eine gute Idee wäre?
Rhymoid
3
@Rhymoid, verwende ich nicht !#viel, aber !!, !$, !*, !sud:pund viele andere sind alle sehr nützlich und ich sie die ganze Zeit. Check out unix.stackexchange.com/a/67/135943
Wildcard
11

In bashist es die Historiensubstitution (alle Historiensubstitutionen beginnen mit !). Konkret !#bedeutet dies alles in der Befehlszeile, und der Zusatz ': 3' bedeutet das dritte Wort (beginnend mit 0).

Also übersetzt der obige Befehl !#:3in ~/bin/ack.

Brian
quelle