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
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. :) –
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