Tırnaksız dosyalarda hangi karakterlerin kaçması gerekir?


12

Bash komutlarını yürüten tarayıcı tabanlı kabuk / terminalim var ve boşluklardan kaçıyorum ama parantezin de kaçması gerektiği ortaya çıkıyor. Tırnak içinde olmayan dosya adları için başka hangi karakterlerin kaçması gerekir?


Ne yapmaya çalıştığınız belli değil. Otomatik tamamlamanın herhangi bir şeyle ne ilgisi var?
Michael Vehrs

@MichaelVehrs Bash'da komutum var mv filename filename-foo, boşluk ve parantez dışında hangi karakterlerden kaçmam gerekiyor?
jcubic

@MichaelVehrs otomatik tamamlama sözü kaldırıldı.
jcubic

Temel olarak, boşluk, kabuk globları, tarih olayları gibi tüm kabuk metakarakterleri. Bu nedenle, yerine bireysel karakterleri kaçan yerine, bütün dosya adı alıntı olmalıdır: mv "$filename" "$newname".
Michael Vehrs

@MichaelVehrs Alıntıdan kaçmanın sorunu çözeceğini biliyorum ama dosya adı olmadan tırnak kullanmam gerekiyor. Terminal emülatörü var ve kullanıcı tırnak kullanmadığında çalışmalıdır.
jcubic

Yanıtlar:


22

Basit çözüm, 'başına tek bir tırnak 'işareti ( ) ve sonuna da tek bir tırnak işareti koymak ve dosya adındaki her karakteri 4 karakterlik sıra ile değiştirmektir '\''. Dizenin 'sonunu işaretleyen kendisi hariç, tüm karakterler tek tırnaklı bir dize içindeki özel anlamlarını kaybeder . Sekans '\'', tek tırnaklı bir değişmezi bitirir, hemen ardından tırnak içinde bir tek tırnak işareti verir ve yeni bir tek tırnaklı değişmezi açar. Böylece dosya adı

This file's name has some weird characters!
Will you manage to escape them?

aşağıdaki gibi alıntılanabilir:

somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'

Çift tırnak işaretleri daha karmaşık kaçış kurallarına sahiptir ve !geçmiş ikamesi etkinleştirilirse bir ünlem işareti eklemenize izin vermez , bu yüzden bunları daha fazla düşünmeyeceğim.

Alternatif bir yaklaşım, karakterleri ters eğik çizgilerle korumaktır. Bu, yeni satırlar hariç her karakter için geçerlidir; yeni satır için, tek tırnak (veya çift tırnak) içine koymak tek çözümdür. Alıntılanan adı kullanıcıya sunmak için ters eğik çizgi sayısını en aza indirmek istiyorsanız, ters eğik çizginin gerekli olduğu yerlerle sınırlandırabilirsiniz; ancak, ne kadar çok ters eğik çizgi atlarsanız, gerekli olanı unutma riskiniz o kadar artar. Harfler, rakamlar ve ASCII olmayan karakterler her zaman iyidir¹. Emin olmadığınız zaman boşluk ve noktalama işareti verin.

Tipik bir kabukla (ksh, bash veya zsh), en azından bazı durumlarda aşağıdaki karakterleri alıntılamanız gerekir.

  • Boşluk (boşluk, sekme, yeni satır - yeni satırların ters eğik çizgi ile tırnak içine alınamayacağını unutmayın).
  • ! - tarihin genişlemesi.
  • " - kabuk sözdizimi.
  • #- boşluktan önce yorum başlangıcı; zsh joker karakterleri.
  • $ - kabuk sözdizimi.
  • & - kabuk sözdizimi.
  • ' - kabuk sözdizimi.
  • (- bir kelimenin ortasında bile: ksh genişletilmiş globlar (bash ve zsh'da da mevcuttur); zsh joker karakterleri.
  • )(bakınız ()
  • * - sh joker karakter.
  • , - sadece iç destek genişlemesi.
  • ; - kabuk sözdizimi.
  • < - kabuk sözdizimi.
  • = - zsh içinde, bir dosya adının başlangıcında (PATH aramasıyla dosya adı genişletmesi).
  • > - kabuk sözdizimi.
  • ? - sh joker karakter.
  • [ - sh joker karakter.
  • \ - kabuk sözdizimi.
  • ] - alıntı yapmadan bırakabilirsiniz.
  • ^- tarihin genişletilmesi; zsh joker karakteri.
  • ` - kabuk sözdizimi.
  • { - destek genişlemesi.
  • | - kabuk sözdizimi.
  • } - zsh içinde kaçması gerekiyor, eşleşen kabuklar olmadığında diğer mermiler daha yumuşak.
  • ~- bir dosya adının başlangıcında ana dizin genişletme; zsh joker karakteri; son karakter olduğunda her zaman güvende.

Birkaç karakter daha bazen özel işlem gerektirebilir:

  • -kabuk için özel değildir, ancak bir komut bağımsız değişkeninin başlangıcında, bir seçeneği belirtir. Özel işleme kabukta değil komutta olduğundan tırnaklarla korunamaz. İle başlayan bir dosya adını korumak için -, ./önüne koyabilirsiniz - bu şekilde hala aynı dosyadır, ancak argüman -artık başlamaz .
  • .kendi başına özel değildir, ancak nokta dosyaları *varsayılan olarak globların dışında tutulur .
  • :kabuk için özel değildir, ancak bazı komutlar özel olarak ayrıştırır, örneğin uzak bir dosyayı belirtmek için ( hostname:filename). İki nokta üst üste içeren dosya adlarıyla nasıl başa çıkılacağını görmek için komutun belgelerine bakın.

Altern Kullanıcı alternatif geçmiş genişletme karakterleri yapılandırmamışsa. Bazı mermiler buna izin verir. Ters eğik çizgiler yerine tek tırnak kullanmanın başka bir nedeni de budur.


Yeni satırlar, en azından LFsadece bazı kabuklarda ters eğik çizgi ile gösterilebilir.
iBug

Herhangi bir sh benzeri kabukta, ters eğik çizgi + yeni satır, yeni satır yerine boş bir dizeye genişler.
Gilles 'SO- kötü olmayı kes'

Bu iyi bir cevap, teşekkürler. Bu bilgilerin 'resmi olarak' mevcut olduğu bir bağlantı var mı?
slashmais

1
@slashmais Hangi bilgiler? Kabuk dilinin sözdizimi, çeşitli kılavuzlarda ve teknik özelliklerde “resmi olarak” mevcuttur, ancak oradan hangi karakterlerin tam olarak açık olmayan yerlerde alıntı yapması gerektiğini tam olarak bulmaya gider.
Gilles 'SO- kötü olmayı kes'

1
Bunu da buldum: tecmint.com/manage-linux-filenames-with-special-characters - listeniz kadar kompakt değil, ancak çok sayıda örneği var. (by-the-by: "Hangi bilgiler?", buradaki konu karakterler ile ilgiliyse hoş bir yanıt değildir)
slashmais
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.