Entendendo o ponto de exclamação (!) no bash

89

eu usei

history | less

para obter as linhas dos comandos anteriores e dos números do lado esquerdo, encontrei a linha que queria repetida (por exemplo, 22) e fiz

!22

no prompt de comando e funcionou - executando o conjunto de comandos na linha que eu fiz naquele momento. Não consigo descobrir onde o ponto de exclamação é usado, o que ele representa em termos de ações tomadas pelo bash e onde usá-lo. A partir da documentação, não vejo uma explicação que seja "tangível".

    
por Vass 03.11.2010 / 20:41

4 respostas

124

! é um recurso que apareceu originalmente no shell C , nos dias anteriores a que você podia contar terminais para ter teclas de seta. É especialmente útil se você adicionar o número do comando atual ao prompt ( PS1="\!$ " ) para poder ver rapidamente sua tela para obter números de comandos anteriores.

Agora que você pode usar as teclas de seta e coisas como Ctrl-R para pesquisar o histórico de comandos, não vejo muito uso para o recurso.

Uma variante dele que você ainda pode achar útil é !! , que re-executa o comando anterior. Por si só, eu não acho ! ! Entre mais rápido que apenas Enter , mas pode ser útil quando combinado em um comando maior.

Exemplo: Um erro do piloto comum em sudo é esquecer o prefixo sudo em um comando que requer privilégios extras. Um iniciante repõe todo o comando. O aluno diligente edita o comando a partir do histórico de comandos do shell. O iluminado digita sudo !! .

O Bash permite desativar o processamento de ! no shell com set +o histexpand ou set +H . Você pode desativá-lo em Zsh com set -K .

    
por 03.11.2010 / 21:06
41

Se não houver uma resposta mais longa aqui, certamente há uma no Superusuário, pois li uma delas recentemente. Na página do bash man você pode encontrar uma seção enorme intitulada EXPANSÃO DA HISTÓRIA sobre o assunto.

Você pode fazer um host inteiro mais do que apenas executar o último comando, ou o número de comando X. Você pode fazer coisas como !cat para executar o último comando iniciado com cat . Ou !?bash?:s/bash/csh/ executa o último comando que contém bash , mas o substitui por csh .

    
por 03.11.2010 / 21:12
29

Muito mais pode ser feito com ! , como:

  • executa um comando que é digitado antes de 3 comandos: !-3
  • executa um comando que começa com !ls

e muito mais. Veja 15 exemplos de expansão do histórico do Bash do Linux que você deve conhecer

    
por 06.03.2012 / 11:34
3

Um amigo meu me enviou por e-mail:

It's part of GNU history library. In bash it is used to re-run commands in your history. If you want to be hardcore, grep for history_expansion_char in bash-4.1/lib/readline/histexpand.c for implementation details.

    
por 04.11.2010 / 14:58