Como passo a maior parte da minha vida no shell do IPython, tenho o mau hábito de preceder os comandos do terminal com pontos de exclamação. Normalmente, isso apenas leva a um erro, mas às vezes faz com que algo ruim aconteça. Posso desativar efetivamente a !
funcionalidade no meu terminal? E isso arriscaria interferir em algum script?
Em shells interativos, por padrão,
!
é usado para expansão de histórico: o shell procurará um comando que corresponda ao texto a seguir!
e o executará. Conforme indicado nesta resposta para Não é possível usar o ponto de exclamação (!) no bash? shells permitem que a expansão do histórico seja desabilitada:set +H
set -K
Se você nunca quiser usar a expansão do histórico orientada por pontos de exclamação, poderá adicioná-los aos scripts de inicialização do seu shell.
Eles não
!
serão ignorados, mas evitarão a execução de comandos do seu histórico.!command
vai reclamar que!command
não existe.Os scripts de shell não são afetados por essas configurações, eles obtêm seus próprios shells com uma configuração não interativa (que não inclui expansão de histórico por padrão).
Se você nunca usa! do terminal, você pode atribuí-lo a uma função que você também nunca usa, como (no meu caso) werase:
Então, sempre que você digitar ! , ele apenas apagará a palavra anterior. Se você digitá-lo apenas no início de um comando de terminal, isso simplesmente não terá efeito.
Se você precisar de um ponto de exclamação real, ainda poderá inseri-lo precedendo-o com CTRL-V (ou qualquer que seja o seu
lnext
caractere) para citá-lo / escapar dele.Se você normalmente não usa a
lnext
funcionalidade, pode achar mais conveniente redefinirlnext
para ser!
; que permitiria que você insira um ponto de exclamação digitando-o duas vezes (o primeiro citando o segundo).Uma explicação mais detalhada de como isso funciona:
A
lnext
funcionalidade é: "não interprete o próximo caractere como algo especial: apenas aceite o caractere como uma entrada exatamente como é". Se for um caractere especial stty, não aplique essa funcionalidade especial, mas apenas use o caractere como ele mesmo. Isso inclui o caractere atribuído àlnext
função.O caractere padrão
lnext
é CTRL-V (mnemônico: "verbatim", como em: digite o próximo caractere literalmente). Aqui, reatribuímos essa função ao caractere!
.lnext
é escolhido principalmente porque seu efeito é "sem efeito" na maioria dos casos (por exemplo, quando o próximo caractere digitado é um caractere normal). Quando você digita acidentalmente!
no início da linha, o próximo caractere quase sempre é um caractere normal, sem nenhuma ação especial, portanto, citá-lo/escapá-lo (tratá-lo explicitamente como um caractere normal) não prejudica. Quando escrevemos uma
depois de um!
, o significado muda de "escreva uma
" para um significado mais específico que faz o mesmo.: "escreva uma
, e ignore qualquer outra coisa, apenas faça!"Se quisermos criar um
!
personagem real, podemos usar essalnext
funcionalidade para citá-lo. Então, digitando!!
, um single!
é inserido.Se estiver usando o
zsh
shell, você pode adicionar ao seu~/.zshrc
:Assim, quando você insere um ou mais
!
no início do buffer de edição, ele os destaca em vermelho, fornece uma mensagem e os remove (após um segundo ou antes, se você digitar qualquer outra coisa).