O que significa! #: 3 em um comando shell

29

O guia de instalação do ack sugere a instalação do script ack usando este comando:

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

Eu assumo que o !#:3 no final é algum tipo de referência, mas o que isso significa? Existe um equivalente em zsh? O Google não ajudou muito.

    
por Matt Pfefferle 15.10.2015 / 15:03

2 respostas

32

Esta é uma sintaxe especial, expandida por bash. Também funciona para zsh.

De acordo com a página man bash (section HISTORY EXPANSION), o padrão expande da seguinte forma:

  • O designador de evento !# refere-se à linha de comando inteira digitada até agora, que é curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • : divide entre o designador de evento (neste caso, a linha inteira) e o designador de palavras (seleciona uma sub-parte)
  • o designador de palavras 3 que seleciona a terceira palavra / argumento (a contagem de palavras começa em zero), neste caso ~/bin/ack .

A linha de comando final (geralmente exibida antes de ser executada) é: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack .

Para detalhes, consulte o manual do bash ou muito parecido com o manual do zsh

    
por 15.10.2015 / 15:16
11

Em bash , é a substituição de histórico (todas as substituições de histórico começam com ! ). Especificamente, !# significa tudo na linha de comando até agora, e a adição ': 3' significa a terceira palavra (contagem inicial em 0).

Portanto, o comando acima traduz !#:3 em ~/bin/ack .

    
por 15.10.2015 / 15:16