From the ack installation page (http://betterthangrep.com/install/) there is a one-liner installation with curl:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
I understand that it's getting the file from the website and saving it to ~/bin/ack, then setting permissions, but what does that last part ( !#:3 ) do ? (I do not recognize the syntax and Googling didn't yield any helpful results)
!#
means to execute the command typed so far, but you can specify a parameter with:n
.:0
would be the first word (curl
),:1
the second one (http...
) and so on.See the section called HISTORY EXPANSION in man bash, particularly the Word Designators subsection.
!#:3
refers to the third word of the pipe, which is (in your example)~/bin/ack
. In order, the words of the command arecurl
, 0;http://betterthangrep.com/ack-standalone
, 1;>
, 2;~/bin/ack
, 3;&&
, 4;chmod
, 5;0755
, 6;!#:3
, 7. That is,!#:3
is a way to repeat the filename without using a separate variable or literal text.Regarding the question about
>
and whitespace, note that>
is a metacharacter, which man bash defines as a “character that, when unquoted, separates words. One of the following: | & ; ( ) < > space tab”. So whitespace does not affect whether>
counts as a token. But note that in the following example, the first3
is quoted so that bash doesn't interpret it as part of a3>
redirection. When the line was entered, bash echoed the expanded line and then executed it.