Kabukta tek tırnaktan kaçmanın bir yolu var mı?


11

Örneğin. söylemek istiyorum

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

Bunu yapmanın daha az garip bir yolu var mı, örneğin tek tırnaklardan kaçmak?

Evet, yazabileceğimi biliyorum

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

Ancak bu soru Perl'de değil, kabukta alıntı yapmakla ilgilidir.

Ben de bunu nasıl ilgileniyorum bashve cshilk etapta.

Yanıtlar:


9

Dennis, cevabındaki olağan alternatiflere dikkat çekiyor (tek-çift, tek-çift, tek tırnaklı dizeler kaçan tek tırnaklarla birleştirildi; Perl'in özelleştirilebilir alıntı operatörlerinden bahsettiniz), ancak belki de bu aradığınız doğrudan cevaptır için.

Bourne benzeri kabuklarda (sh, ksh, kül, tire, bash, zsh, vb.) Tek tırnaklı teller tamamen değişmezdir. Bu, kabuğun özel olarak onlardan kaçmak zorunda kalmadan tedavi edeceği karakterleri dahil etmeyi kolaylaştırır, ancak tek tırnak karakterinin tek tırnaklı dizelere eklenemeyeceği anlamına gelir.

Başka açılardan tamamen kırıldıkları için csh tipi mermileri düşünmeyi bile reddediyorum (bkz. Csh Programlama Zararlı Olarak Kabul Edilir ).


Teşekkür ederim. "Bu imkansız" - beklediğim cevap bu :) Her zaman burada bu rolü oynamaya adanmış belgeler olmasını umuyordum.
kodik

Perl'den farklı olarak, Bourne benzeri kabuk burada belgeler sadece stdin yoluyla girdi sağlamak için doğrudan yararlıdır. Tabii ki, onlara tek tırnak koyabilirsiniz. Ayrıca, buradaki bir belgenin "gerçek modunu" şu sözle alıntılayarak da etkinleştirebilirsiniz: (örn.) blah <<\EOF … EOF. Ayrıca <<'EOF've öğelerini de kullanabilirsiniz <<"EOF. Hepsi burada gerçek belgeler anlamına gelir (Perl'den farklı olarak). Gerçekten kararlı olsaydınız, yapabilirdiniz blah "$(cat<<\EOF … EOF )" other args(komut yerine yazarken boşluklar yazdığım yeni satırları kullanarak; ksh ve zsh kedi olmadan yapabilir , diğerleri buna ihtiyaç duyar). Ama buna gerçekten değer mi?
Chris Johnsen

Sadece zsh tek tırnak oldukça değişmez olmadığını not etmek istiyorum. Zsh, tek tırnaklı bir dizginin herhangi bir yerindeki bir '\ U' karakterini karakter kodu olarak yorumlamaya çalışacaktır, örneğin echo '\U0000068\U000069''hi' yankıları. Kabukta bir hata olmadığı sürece neden olsa emin değilim.
Matthew

1
@Matthew: Bu \Udurumda yorumlama yerleşik echo komutu ile yapılıyor (bu davranış -EBSD_ECHO seçeneği ile kontrol edilebilir ve -e). Değişmez dizenin diğer komutlarda iletildiğini (ve başka bir şekilde yorumlanmadığını) görebilirsiniz; örn printf %s\\n '\U0000068\U000069'.
Chris Johnsen

@ChrisJohnsen Teşekkürler, zsh için yeniyim ve bunu fark etmedim ama haklısın. Man sayfası bana -e'nin varsayılan olduğunu, ancak zsh'ın bunu geçersiz kılması gerektiğini söyledi.
Matthew

5

Benim için tüm örnekleriniz şunları üretir:

Selam Dünya!

Ve bu da:

perl -e 'print "Hello, world!", "\n";'

Ve bu:

perl -e 'print '\''Hello, world!'\'', "\n";'

Ne yapmaya çalıştığınızı açıklığa kavuşturabilir misiniz?

Bash gibi kabukta, tırnak işaretlerini dizenin bir parçası olarak yazdırmak istiyorsanız, bir tür tırnak diğerinden kaçar.

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

Düzenle:

İşte başka bir yol:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

Ünlem işaretinden sonraki boşluk geçmiş genişletme hatasını önler. Onun set +Hyerine yapabilirdim.


1

Önceki yanıtta yaptığım düzenlemenin görünüp görünmeyeceğinden emin değilim:

Aynı yeni bir cevapla yapıştırarak:

Alternatif yaklaşım:

Çözümünüzü denediğimde hala baskı alamadım.

Ama ipucunu çözümünüzden aldım ve aşağıdakileri denedim:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

ASCII değeri '39'dur.

İlgilenilen bir yerde eklemek için dosyaları bir satır içi düzenleme yapmak için buna ihtiyacım vardı.


1

Burada belge kaçmayı önemsememenin en iyi yoludur:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Burada belirtilen belgeyi kullanarak tüm genişletmeyi tamamen engelleyebilirsiniz:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Girdi yerine argüman olarak iletmek isterseniz, xargs kullanabilirsiniz:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

Bunu bash'da yapmak için bir seçenek olup olmadığını bilmiyorum, ancak zsh ile seçeneği ''açtıktan sonra kullanabilirsiniz RC_QUOTES. (Zsh'ı denemenizi tavsiye ederim; çoğunlukla bash uyumludur ve daha fazla uyumluluk için bash'ı taklit edebilir.)

Bash ile (ve çoğu zaman zsh ile), sadece kullanıyorum '\''çünkü okumak daha kolay '"'"'.

Csh içinde nasıl yapılacağı hakkında hiçbir fikrim yok.


-1

Perl betiğinin bir parçası olarak dahili olarak kullanıldığında perl ile tırnaklardan kaçmak için \ 've \ "kullanabilirsiniz. Komut satırının bunu kabul edip etmeyeceğinden emin değilim.


3
Çok kolay olsaydı, sormazdım. Bir cevap göndermeden önce deneyebilir ve çalışıp çalışmadığını görebilirsiniz.
kodik
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.