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.)