ti-enxame.com

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

Eu usei

history | less

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

!22

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

112
Vass

! é um recurso que apareceu originalmente no C Shell , antigamente, antes de você poder contar com terminais para ter teclas de seta. É especialmente útil se você adicionar o número do comando atual ao Prompt (PS1="\!$ ") para que você possa olhar rapidamente para a tela para obter números de comandos passados.

Agora que você pode usar as setas e coisas como Ctrl-R para pesquisar o histórico de comandos, não vejo muita utilidade para o recurso.

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

Exemplo: Um erro comum - piloto on Sudo baseado systems é esquecer o prefixo Sudo em um comando que requer privilégios extras. Um iniciante redigita o comando inteiro. O aluno diligente edita o comando a partir do histórico de comandos do Shell. O iluminado digita Sudo !!.

O Bash permite desativar ! processando no Shell com set +o histexpand ou set +H. Você pode desativá-lo no Zsh com set -K.

157
Warren Young

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

Você pode executar um host inteiro mais do que apenas executar o último comando ou o número de comando X. Você pode executar ações 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.

52
Cry Havok

Muito mais pode ser feito com ! tal como:

  • execute um comando digitado antes de 3 comandos: !-3
  • execute um comando que comece com !ls

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

40
user379997

Claro que você pode fazer !! para reutilizar o último comando no bash Shell. E então há !$ para reutilizar a última parte do seu último comando.

por exemplo. ver algum arquivo

less path/to/your/file.txt

Se agora você deseja editar o mesmo arquivo, pode usar !$ para obter apenas o caminho do arquivo do último comando

vim !$

EDITAR:

Você pode usar todos os argumentos do comando anterior com !*

por exemplo: isso criará alguns arquivos e removerá todos eles

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Novamente, você pode usar um argumento específico do comando anterior

por exemplo. Isso cria 4 arquivos e remove o terceiro arquivo (c.txt)

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

Da mesma forma, você pode usar uma variedade de argumentos do último comando da seguinte maneira

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Isso reutilizará os argumentos 2 a 4 que avaliam a expressão como rm b.txt c.txt d.txt

6
Teshan Shanuka J

Um amigo meu me enviou este e-mail:

Faz parte da GNU. No bash, é usado para executar novamente comandos no seu histórico. Se você quiser ser hardcore, grep for history_expansion_char no bash-4.1/lib/readline/histexpand .c para detalhes da implementação.

4
Vass