Para poder desativar a expansão do histórico em uma linha de comando específica, você pode usar space
como 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 $HISTCONTROL
contém ignorespace
como uma maneira de informar bash
para 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 foo
funciona, 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á).