Kısaca, ünlem işaretinden nasıl kaçabilirim?


183

Gibi bir şey yapmak istiyorum bzr commit -m "It works!". Yaparak ünlem işaretinden kaçabilirim bzr commit -m "It works\!". Ancak, o zaman benim taahhüt mesajı ters eğik çizgi içerir. Ters eğik çizgiyi görmezden gelirken ünlem işaretinden nasıl kaçabilirim?


1
Yapmak da bzr commit -m "It works"!işe yarıyor.
kba

1
Daha önce de belirttiğim gibi koyduğunuz komut aslında kendi başına işe bzr commit -m "It works!"
yarıyor


1
Kabul edilen cevap, taahhüt problemleriniz için iyi bir geçici çözüm olsa da, asıl sorunun cevabı olmadığını düşünüyorum: Bash tarihinin genişlemesi . Lütfen Dennis'in cevabını kabul etmeyi düşünün.
Arjan

Yanıtlar:


153

İleti iletinizde değişkenleri genişletmek için bash bağımlı olmadığınız için bunun yerine tek tırnak kullanabilirsiniz. Tek tırnak içindeki dizeler bash ile genişletilmez.

bzr commit -m 'This does work!' 

24
“Ünlem işaretinden nasıl kaçabilirim?” Sorusundan beri. ve "Bir ünlem işaretini nasıl genişletmem?" değil. Bunun geçerli olduğunu sanmıyorum. Bunun işe yaramadığı bazı zamanlar (aynı kesme satırındaki kesme ve ünlem işaretlerini geçerken olduğu gibi) vardır. Aşağıdaki cevap, birçok insanın ihtiyaç duyduğu şeyi yapmak için çok daha iyi çalışır.
Jann

7
@Jann: Bu konuda% 100 haklısın, ama bence sorun burada süper kullanıcı hakkında çok fazla soru olan bir soru: Soruya noktaya mı cevap veriyoruz veya insanların kendi sorunlarını çözmelerine yardımcı mıyız? Her iki yolun da faydalı olabileceğini düşünüyorum ve bu belirli bir konuda yardım istiyordu.
Benjamin Bannier

Touché! Bu belirli bir konuydu. Sadece birçok durumda kullanılabilecek sorularıma cevap vermek istiyorum. pS: Bundan bahsetmemin sebebi hem kesme işareti hem de ünlem işaretini perl programına geçirmem gerekiyordu ve aşağıdaki çözüme ihtiyacım vardı. :)
Jann

Hem Benjamin hem de Jann ile aynı fikirdeyim ama bir oy verdim. Sorunun başlığı arama motorları tarafından endekslendi ve bu yüzden buraya geldim ve muhtemelen çoğu kullanıcı buraya geliyor. Bu yüzden asıl sorunun yansımasının arkasındaki sorun olduğuna inanıyoruz. Diğer forumlarda, insanlara tam olarak ne aradıklarını sormaları tavsiye edilir (neredeyse zorlanır). Kötü ifade edilen soruları cevaplamak, özensizliği destekler ve buradaki olumsuz oyumun nedeni budur. Bir uzlaşma / çözüm olarak önerim, başlığın adapte edilmesine yardımcı olmak, böylece asıl sorunu yansıtıyor.
ChristophK

153

Ünlemin yanı sıra çift tırnak işareti istiyorsanız, işte başka bir yöntem:

echo "It's broken"'!'

Bu !, satırın sonunda olmasa bile çalışır .

Örneğin:

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

Bonus: Sh veya Bash'deki herhangi bir metinden kaçmak için benzer bir teknik kullanılabilir (sed'in yardımıyla): bu cevabın ilk seçeneğine bakın . Eğer varsa Ayrıca, bash-completionyüklü, büyük olasılıkla sahip işlev zaten mevcut.quote()


4
Güzel ipucu, JWD. Bash string'lerin aralarında boşluk bırakarak birleştirilebileceğinin farkında değildim.
Alan H.

Aslına bakarsanız ünlem işareti dizenin sonundaysa, açık bir echo "Happy birthday!"şekilde beklendiği gibi çalışabilirsiniz, aksi takdirde bir ters eğik çizgi ile kaçabilirsiniz, ancak ters eğik çizgi de basılacak ve XD Bash kalbe göre değil :)
h4unt3r,

@ h4unt3r: Garip, bu benim deneyimim değil. Benim için echo "Happy Birthday!"2 satır çıktı verir. Birincisi echo "Happy birthday"(ünlem yok) ve ikincisi "Doğum günün kutlu olsun" (yine ünlem yok). Bu testi yaparken tarihin genişlemesi açık mı?
jwd

@jwd hangi bash sürümünü kullanıyorsunuz? Her zaman üzerinde hist genişlemesi var. Yanlışlıkla iki kullandın mı !! Testin için mi?
h4unt3r,

@ h4unt3r:, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)kesinlikle yalnızca bir tane !kullanılıyor. Ben histexpandmevcut $SHELLOPTS. Ancak, 4.3.18 (2) 'yi başka bir makinede yayınlamayı denedim ve açıkladığınız gibi davranıyor. Sanırım düzeltilen bir hataydı.
jwd

66

Geçmiş genişlemesini kapat :

set +H

veya

set +o histexpand

~/.bashrcGenellikle tarih genişletme özelliğini kullanmıyorsanız , bu komutlardan birini ekleyebilirsiniz .

Bash 4.3 özel bir vaka ekledi :

tarih genişletme karakteri, çift tırnaklı bir dizgede kapanış çift alıntıdan hemen önce gelirse alıntı olarak kabul edilir.


Teşekkürler - bu işe yaradı ama yapmak zorunda set +o histexpanddeğildim set -o histexpand. Bunu düzeltmek için cevabınızı düzenler misiniz?
Matthew,

Üzgünüz, yazım hatası, özür dilerim. Sabit.
Dennis Williamson

mükemmel! Bunu AGES için arıyordu .... thx vm! kaçış işe yaramayacak gibi ... Ben de tek tırnak kullanmak istemiyorum ... Bunu benim .bashrcthx'ime ekleyeceğim !!! her zaman can sıkıcıydı ...
Kova Gücü

Bu çok harika! echo "@AquariusPower!"
joehanna

12

Çift tırnak (()) yerine tek tırnak (') kullanın. Tek tırnak, içindeki tırnakların yorumunu kapatırken, çift tırnak sadece bazılarını kapatır.

bzr commit -m 'It works!'

4

Şimdi yeni bir yol buldum, bu en azından echobir ünlem işaretiyle noktalamak istediğiniz dizeleri (cümleleri) kullanmakla işe yarayacak . Bash histexpand'in etrafında az ya da çok bir son çalıştırma yapar ve kodlaması yalnızca biraz daha uzun sürer.

Ünlem işareti için bir onaltılık, listelenen olarak http://www.ascii-code.com/ , 21, yani koyarsanız \x21sizin dizesinin sonunda, echo -e $fooyapmak $foo, kendi genişletilmiş yankı [yani foo=$(echo -e "$foo")], ne sonunda echo $footekrar bir dize olduğunda olsun !. Ve hiçbiri değişmeyen histexpand.

Bash 4+ ile kesinlikle çalışır. Önceki sürümler, ymmv.


Hmmm benim için çalışmıyor.
14'te

Kendini yankılama hakkında söylediklerini anlamadım. 'echo -e' ve 'printf', kaçan sekizli, onaltılı ve Unicode kodlarını yorumlar. Bunlardan herhangi birini kullandığınız durumlarda, ünlem işareti için "\ 041" ("!" İçin sekizli) veya "\ x21" (onaltılık) düğmelerini kullanabilirsiniz. Örneğin: printf "OMG\041". Eğer eko ya da printf olmayan bir yerde çift tırnaklı bir ip oluşturuyorsanız, OP'nin sorduğu taahhüt dizesi gibi $(echo -e "\041"), ünlem işaretinin olması gereken dizgeye gömebilirsiniz . Bunun gibi: bzr commit -m "This is a great commit$(echo -e "\041")".
Todd Walton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.