Substituição do terminal! seguido por um número com um comando

12

Estou muito confuso com a minha sessão de terminal do ubuntu, parece substituir seções em comandos que começam !seguidos por um número por comandos aparentemente aleatórios. Faz isso !87substituindo-o por screen -le também !88substituindo-o por ls.

Qualquer idéia de por que isso está acontecendo seria muito apreciada.

usbpc102
fonte

Respostas:

20

Essa é basha expansão da história, por exemplo

!87

reexecuta o comando da linha do histórico 87.

Você encontra a descrição desse recurso na man bashseção "EXPANSÃO DA HISTÓRIA":

       An  event  designator  is  a  reference  to a command line entry in the
       history list.  Unless the reference is absolute, events are relative to
       the current position in the history list.

       !      Start  a  history substitution, except when followed by a blank,
              newline, carriage return, = or ( (when the extglob shell  option
              is enabled using the shopt builtin).
       !n     Refer to command line n.
       !-n    Refer to the current command minus n.

Então, para chamar rapidamente o último comando, faça !-1e para o quinto último comando !-5. Um sinônimo útil para !-1é !!- se você ligou, por exemplo, apt install somethinge esqueceu o sudo, basta executar sudo !!e você é bom.

Apenas barra invertida ( \ ) e aspas simples podem citar o caractere de expansão do histórico.

Para evitar a expansão do histórico, você precisa escapar do ponto de exclamação com uma barra invertida ( \!) ou usar aspas simples ( '!').

sobremesa
fonte
3
para passar um material literário !para seus comandos e evitar a expansão do histórico, você precisará aspas simples ou escapar deles: foo '!87'ou foo \!87. (aspas também irá realizar a expansão de seus conteúdos.)
quixotesca