No bash, como faço para escapar de um ponto de exclamação?

164

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?

    
por Matthew 22.04.2010 / 20:53

5 respostas

135

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!' 
    
por 22.04.2010 / 21:31
141

Pergunta antiga que conheço, mas para futuros pesquisadores:

Você também pode usar esse método se quiser aspas duplas e a exclamação:

echo "It's broken"'!'

Isso funciona mesmo se o ! não estiver no final da linha.

Por exemplo:

echo "hello there"'!'" and goodbye"

Bônus: Uma técnica similar pode ser usada para escapar de 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, provavelmente terá a função quote() já está disponível.

    
por 23.06.2011 / 21:16
63

Desative a expansão do histórico :

set +H

ou

set +o histexpand
    
por 22.04.2010 / 20:58
9

Use aspas simples (') em vez de aspas duplas ("). As aspas simples desligam toda a interpretação das coisas nelas, enquanto as aspas duplas desativam apenas algumas.

bzr commit -m 'It works!'
    
por 22.04.2010 / 21:32
4

Acabei de encontrar outra maneira, que pelo menos funcionará com echo ing strings (frases) que você deseja pontuar com um ponto de exclamação. Faz um final, mais ou menos, em torno do histexpand do Bash e demora apenas um pouco mais para codificar.

O hexadecimal para um ponto de exclamação, conforme listado O link é 21, então se você colocar \x21 no final da sua string, echo -e $foo , faça $foo seu próprio eco expandido [ie, foo=$(echo -e "$foo") ], o que você obtém quando você echo $foo novamente é a string com um ! no final. E sem trocar histexpand.

Funciona com certeza no Bash 4+. Versões anteriores, ymmv.

    
por 23.11.2011 / 05:28