Bir cd komutuna aktarılan parantezleri nasıl koruyabilirim? [çift]

18

burada cd alan nasıl korunur. Sekme tamamlama harika, ancak bazen yolu panodan yapıştırırsınız, bu yüzden yararlıdır.

Çözüm parantezlerle birlikte kırılır. Girişden kaçmayı ve korumayı denediğinizde, her zaman geri döner:

bash: syntax error near unexpected token '('

Ayrıca parantez ile uğraşmak için bir yolu var mı? İstediğim şey, buna girdiğimde işe yarıyor:

cd My path with spaces (and parentheses)
    
sordu Strapakowsky 30.03.2013 02:35

2 cevap

18

Bağımsız değişkenin etrafında tek tırnak işareti ' kullanın. (Bu sadece cd değil, herhangi bir komut için çalışır.)

cd 'My path with spaces (and parentheses)'

Bash'i parantezleri cd 'ye geçiremezsiniz. Her şeyin işe yaraması çok özel bir hack.

Tek tırnaklar, ' 'nin kendisi dışında her karakterin etrafında çalışır. Tek tırnak işaretlerini% 4 karakter dizisi '\'' .

ile değiştirin.

cd 'Apostrophe'\''s a pain'

Bu, dizin adı tire ile başlıyorsa çalışmaz, çünkü bu, cd komutunun argümanı bir seçenek olarak yorumlamasına neden olur. Bunu önlemek için dizin adından önce -- geçirin.

Bkz. İşte daha fazla bilgi için.

Başka bir yöntem, kabuğun komut satırında argümanı iletmek yerine ayrı bir metin satırı okumasıdır.

[email protected] ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
[email protected] ~/My path with spaces (and parentheses)$ 

El ile kopyala yapıştırmak yerine, programlı olarak da yapabilirsiniz. xclip veya xsel 'ı yükleyin.

cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"

Bunu bir takma isim haline getirebilirsiniz.

alias cde='cd -- "$(xsel -bo)"'
    
verilen cevap Gilles 30.03.2013 03:14
6

Nasıl doğru cd dizinlerinde boşluk ve parantez gibi karakterler ile doğru adlar:

Klasör adınız, tek tırnak işareti ' içermiyorsa, yalnızca tek tırnak içine alın:

cd 'My path with spaces (and parentheses)'

' içermiyorsa ancak çift tırnak işareti karakteri " ,% back_ \ , backquote ' veya dolar $ içermiyorsa, çift tırnak içine alın:

cd "My path with spaces (and parentheses)"

Bir dosya veya dizin adının hem tek hem de çift tırnak içerdiği çok yaygın değildir. (Bu, bir dosya veya dizin adının çift tırnak işareti içermesiyle ilgili yaygın olmayan bir durumdur. Başlangıçta çift tırnak önerilmemesinin tek nedeni, tek tırnakların aksine, çift tırnakların $ 'nin genişletilmesine izin vermesidir. Ortam değişkenleri. Eğer dosya adınız% co_de karakter ve ardından metin içeriyorsa bu sorun olur.)

Her ikisini de içeriyorsa veya yalnızca başka bir yöntem istiyorsanız, o zaman her alandan ve parantezden manuel olarak $ bir ters eğik çizgi karakteri ekleyerek manuel olarak çıkabilirsiniz:

cd My\ path\ with\ spaces\ \(and parentheses\)

Bu sinir bozucu, ama neyse ki, kabuk sizin için yapar , eğer ismin baş harfini yazarsanız ve Sekmesi 'ye basın. % Co_de% ile başlayan birden fazla dosya veya dizin adı varsa, genişletmek için biraz daha yazmanız gerekebilir. Sekmesi 'ye basarsanız ve genişlemezse, daha önce yazdığınızla eşleşen dosyaların listesini görmek için tekrar Sekmesi ' ye basabilirsiniz. Daha sonra, benzersiz bir şekilde eşleşmesi ve genişletilmesi için yazmanız gereken daha fazla şey olduğunu bilirsiniz.

Alternatif olarak, dahili tırnaklardan da kurtulabilirsiniz. Örneğin, adında bir klasörün olduğunu varsayalım:

Mischa's gardening tips for "home and office"

Kullanabilirsiniz:

cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"

Ancak basitçe kullanabilirsiniz:

cd 'Mischa'\''s gardening tips for "home and office"'

Ters eğik çizgi tek tırnak işareti içinde özel değildir, bu yüzden tek tırnaklı dizgeyi sonlandırır, ters eğik çizgi korumalı tek bir alıntı ekler ve hemen ayrı bir argüman başlatacak herhangi bir alan olmadan başka bir tek tırnaklı dizgeyi başlatırız.

Muhtemelen \ 'nin istediğiniz şekilde çalışmasını sağlayamıyorsunuz:

My 'in çalışmasını sağlamak için: hayır, bunu gerçekten yapamazsınız, çünkü bu davranış cd komutuna özgü değildir, herhangi bir komutun çalışmasının bir parçası olur. Bir komut çalıştırıldığında, kullanıcı tarafından sağlanan argümanların bir listesini verir. Kabuk bir boşluk gördüğünde, bir argümanın bittiğini ve bir başkasının yeni başladığını bilir. Bir alanı bir argümanın parçası olarak geçmek için yukarıdaki yollardan biriyle alıntılanması gerekir.

Bu sürenin bir kısmı 'nı elde edebilirsiniz. cd My path with spaces (and parentheses) klasörüne gitmek için cd çalışması yapabilirsiniz. Tüm kullanıcı tarafından sağlanan argümanları boşluklarla birleştiren bir kabuk komut dosyası yazarak bunu başarabilirsiniz. (Daha sonra isterseniz, cd My path with spaces dosyasının kendisinde bu komut dosyasını çağırabilirsiniz, bunun için My path with spaces adlı bir kabuk takma adı oluşturarak, şu anda normal olarak çalıştığınız kabuk cd öğesinden öncelikli olacaktır.) Ancak:

  • Komut dosyası cd ve cd için farklı argümanlar almayacak, bu yüzden My path with spaces başarısız olacak veya yanlış klasöre girecek.

  • Bunu parantezler için yapamazsınız, çünkü bunlar kabuk tarafından herhangi bir şekilde bir komuta iletilmeyecek şekilde gruplamak için kullanılır. Aslında, çoğu zaman kabuk sadece bir sözdizimi hatası atar (tıpkı gördüğünüz gibi):

    [email protected]:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token '('
    

    Ne değiştirirseniz değiştirin, bu komut verildiğinde sözdizimi hatası oluşmaya devam eder.

"Muhtemelen bu işi yapamazsın" diyorum, çünkü istediğin gibi davranan kendi kabuğunu yapabilirsin. Fakat bu son derece zordur ve bu değişikliği yapmak için herkesin bunu yapmak istememesi olası değildir. (Varolan bir kabuğun kaynak kodunu da değiştirebilirsiniz, ki bu daha pratik bir çözümdür, ancak çoğu insanın uygulamak istediğinden daha fazla çaba gerektirir.) Bunun yanı sıra, My path with spaces 'in, dizin isimlerini de dahil olmak üzere keyfi karakterlerle kabul etmesi olası değildir. Windows'da olduğu gibi, onlardaki boşluklar.

Bunun neden Windows üzerinde çalıştığını ve Ubuntu'da çalışmadığını merak ediyorsanız: Windows'ta komutlar, sonradan yazılan metnin metin dizesi olarak ve bir komutun yorumlanması gerektiğinde iletilir. Bu dizge, ayrı argüman dizisi olarak (genellikle, ancak her zaman değil), komutun kodu, komut satırı dizesini ayrıştıran özel bir kütüphane işlevini çağırmalıdır. (Bir C programında, bu sahne arkasında gerçekleşir, ancak yine de Windows API kullanımını içerir.)

    
verilen cevap Eliah Kagan 30.03.2013 03:05

Etiketlerdeki diğer soruları oku