2012-10-14 9 views
5

Von der ack Installationsseite (http://betterthangrep.com/install/) gibt es eine Einzeiler Installation mit Curl:Ungewohnte Shell-Syntax in ack-grep Installationsskript

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3 

Ich verstehe, dass es Die Datei von der Website holen und in ~/bin/ack speichern, dann die Berechtigungen setzen, aber was macht der letzte Teil (! #: 3)? (Ich erkenne die Syntax nicht und Googling ergab keine hilfreichen Ergebnisse)

+3

Ich bin der Betreuer von betterthangrep.com und ich wusste nicht einmal, was es getan hat, außer zu wissen, dass es funktioniert hat. Danke, dass Sie gefragt haben, was ich hätte fragen sollen, wenn jemand es mir vorgelegt hat. :) –

+1

Bitte verwenden Sie keine Anrede wie ["Danke im Voraus!"] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from) -Posts). Und füge sie nicht zu den Posts anderer Leute hinzu. – NullUserException

Antwort

6

Siehe den Abschnitt namens HISTORY EXPANSION in Mann Bash, insbesondere die Word Designators Unterabschnitt. !#:3 bezieht sich auf das dritte Wort der Pipe, welches (in Ihrem Beispiel) ~/bin/ack ist. Der Reihe nach sind die Wörter des Befehls curl, 0; http://betterthangrep.com/ack-standalone, 1; >, 2; ~/bin/ack, 3; &&, 4; chmod, 5; 0755, 6; !#:3, 7. Das heißt, !#:3 ist eine Möglichkeit, den Dateinamen zu wiederholen, ohne eine separate Variable oder literalen Text zu verwenden.

In Bezug auf die Frage > und Leerzeichen, beachten Sie, dass > ist ein Metazeichen, das Mann Bash definiert als ein "Zeichen, das, wenn nicht zitiert, Wörter trennt. Einer der folgenden Punkte: | &;() <> Leertaste ". Whitespace beeinflusst also nicht, ob > als Token gilt. Beachten Sie jedoch, dass im folgenden Beispiel die erste 3 so zitiert wird, dass bash sie nicht als Teil einer Umleitung von 3> interpretiert. Als die Zeile eingegeben wurde, echote bash die erweiterte Zeile und führte sie dann aus.

$ seq '3'>bbb;cat !#:3 !#:2 ccc; head !#:3 !#:8 
seq '3'>bbb;cat bbb > ccc; head bbb ccc 
==> bbb <== 
1 
2 
3 

==> ccc <== 
1 
2 
3 
+0

Wird das nach Bedeutung oder Leerzeichen tokenisiert? Wenn es "curl url file" wäre, würde es jetzt zwei oder vier Wörter geben? –

+0

Es ist nach Whitespace tokenisiert. Die Zählung beginnt mit Null, also ist 'curl' gleich 0, die URL 1, der Umleitungsoperator 2 und die Datei 3. – chepner

+2

@AndyLester, siehe auch Beispiel –

3

!# bedeutet, dass der Befehl so weit getippt auszuführen, aber Sie einen Parameter mit :n angeben. :0 wäre das erste Wort (curl), :1 das zweite (http...) und so weiter.