Eu quero fazer algo como bzr commit -m "It works!"
. Eu posso escapar do ponto de exclamação fazendo bzr commit -m "It works\!"
. No entanto, minha mensagem de commit inclui a barra invertida. Como faço para escapar do ponto de exclamação, enquanto ainda ignoro a barra invertida?
Como você não depende do bash para expandir variáveis em sua mensagem de commit, você pode usar aspas simples. Strings entre aspas simples não são expandidas por bash.
bzr commit -m 'This does work!'
Pergunta antiga que conheço, mas para futuros pesquisadores:
Você também pode usar esse método se quiser aspas duplas, bem como a exclamação:
echo "It's broken"'!'
Isso funciona mesmo se o !
não está no final da linha.
Por exemplo:
echo "hello there"'!'" and goodbye"
Bônus: Uma técnica similar pode ser usada para escapar qualquer texto em Sh ou Bash (com a ajuda de sed): veja a primeira opção em esta resposta. Além disso, se você tiver bash-completion
instalado, você provavelmente tem a quote()
função já está disponível.
Desligar expansão da história:
set +H
ou
set +o histexpand
Use aspas simples (') em vez de aspas duplas ("). As aspas simples desligam todas as interpretações das coisas nelas, enquanto as aspas duplas desativam apenas algumas.
bzr commit -m 'It works!'
Acabei de encontrar outro jeito, que pelo menos funcionará com echo
seqüências de caracteres (frases) que você deseja pontuar com um ponto de exclamação. Ele faz um funcionamento final, mais ou menos, em torno do histexpand Bash e demora apenas um pouco mais para codificar.
O hexadecimal para um ponto de exclamação, conforme listado
http://www.ascii-code.com/, é 21, então se você colocar \x21
no final da sua string, echo -e $foo
, faço $foo
seu próprio eco expandido [isto é, foo=$(echo -e "$foo")
], o que você ganha quando você echo $foo
novamente é a string com um !
no fim. E sem trocar histexpand também.
Funciona com certeza no Bash 4+. Versões anteriores, ymmv.