Eu quero fazer algo parecido bzr commit -m "It works!"
. Eu posso escapar do ponto de exclamação fazendo isso bzr commit -m "It works\!"
. No entanto, minha mensagem de confirmação inclui a barra invertida. Como escapar do ponto de exclamação, enquanto ainda ignoro a barra invertida?
bash
syntax
escape-characters
Mateus
fonte
fonte
bzr commit -m "It works"!
obras também.bzr commit -m "It works!"
Respostas:
Como você não depende do bash para expandir variáveis na sua mensagem de confirmação, você pode usar aspas simples. Cadeias de caracteres entre aspas simples não são expandidas pelo bash.
fonte
Aqui está outro método, se você quiser aspas duplas, além da exclamação:
Isso funciona mesmo que
!
não esteja no final da linha.Por exemplo:
Bônus: Uma técnica semelhante pode ser usada para escapar de qualquer texto em Sh ou Bash (com a ajuda de sed): veja a primeira opção nesta resposta . Além disso, se você
bash-completion
instalou, provavelmente já possui aquote()
função disponível.fonte
echo "Happy birthday!"
, conforme o esperado, caso contrário, poderá escapar com uma barra invertida, mas a barra invertida será impressa também. XD Bash não é para os fracos de coração :)echo "Happy Birthday!"
gera 2 linhas. O primeiro éecho "Happy birthday"
(sem exclamação) e o segundo é "Feliz aniversário" (novamente, sem exclamação). Você tem a expansão do histórico ativada ao fazer este teste?version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
definitivamente apenas um!
sendo usado. Eu tenhohistexpand
presente$SHELLOPTS
. No entanto, tentei apenas liberar o 4.3.18 (2) em outra máquina e ele se comporta como você descreveu. Eu acho que foi um bug que foi corrigido.Desative a expansão do histórico :
ou
Você pode adicionar um desses comandos ao seu
~/.bashrc
se você normalmente não usa a expansão do histórico.O Bash 4.3 adicionou um caso especial :
fonte
set +o histexpand
, nãoset -o histexpand
. Você poderia editar sua resposta para corrigir isso?.bashrc
thx !!, nunca usado!
em scripts e por nada !! sempre foi preocupante ...echo "@AquariusPower!"
Use aspas simples (') em vez de aspas duplas ("). As aspas simples desativam toda a interpretação do conteúdo, enquanto as aspas duplas desativam apenas algumas.
fonte
Acabei de encontrar outra maneira, que pelo menos funcionará com
echo
as strings (frases) que você deseja pontuar com um ponto de exclamação. Ele executa uma execução final, mais ou menos, em torno da expansão do Bash e leva apenas um pouco mais de tempo para codificar.O hexadecimal para um ponto de exclamação, conforme listado em http://www.ascii-code.com/ , é 21; portanto, se você colocar
\x21
no final da sua stringecho -e $foo
, faça$foo
seu próprio eco expandido [ou seja,foo=$(echo -e "$foo")
] get quando vocêecho $foo
novamente é a string com um!
no final. E também não é possível mudar de assunto.Funciona com certeza no Bash 4+. Versões anteriores, ymmv.
fonte
printf "OMG\041"
. Se você estiver construindo uma cadeia de caracteres com aspas duplas em algum lugar que não seja eco ou printf, como a cadeia de confirmação OP consultada, você poderá incorporar$(echo -e "\041")
a cadeia de caracteres onde deveria estar o ponto de exclamação. Como esta:bzr commit -m "This is a great commit$(echo -e "\041")"
.