Para poder desativar a expansão do histórico em uma linha de comando específica, você pode usar spacecomo o terceiro caractere de $histchars:
histchars='!^ '
Então, se você digitar seu comando com um espaço à esquerda, a expansão do histórico não será executada.
bash-4.3$ echo "#!/bin/bash"
bash: !/bin/bash: event not found
bash-4.3$ echo "#!/bin/bash"
#!/bin/bash
Observe, no entanto, que os espaços à esquerda também são usados quando $HISTCONTROLcontém ignorespacecomo uma maneira de informar bashpara não registrar uma linha de comando no histórico.
Se você deseja que ambos os recursos sejam independentes, precisará escolher outro caractere como o terceiro caractere $histchars. Você quer um que não afete a maneira como seu comando é interpretado. Algumas opções:
- using backslash (
\): \echo foofunciona, mas tem o efeito colateral de desativar aliases ou palavras-chave.
- TAB: para inseri-lo na primeira posição, você precisa pressionar Ctrl+VTab.
Se você não se importa digitando duas chaves, você pode escolher qualquer personagem que normalmente não aparecer na primeira posição ( %, @, ?, escolher o seu próprio) e fazer um alias vazio para ele:
histchars='!^%'
alias %=
Em seguida, insira esse caractere, espaço e seu comando:
bash-4.3$ % echo !!
!!
(você não poderá não gravar um comando em que a substituição do histórico tenha sido desativada. Observe também que o terceiro caractere padrão $histcharsé #para que a expansão do histórico não seja feita nos comentários. Se você o alterar e inserir comentários no prompt, você deve estar ciente do fato de que as sequências! podem ser expandidas lá).