Yol adında boşluklarla dizine cd'ye basmak komut dosyası


96

Bash'i macOS X üzerinde kullanıyorum ve çalıştırıldığında başka bir dizine dönüşecek basit bir yürütülebilir komut dosyası oluşturmak istiyorum. Ancak, bu dizine giden yolun içinde boşluklar vardır. Bunu nasıl yapıyorsun? Bu benim sahip olduğum şey ...

Dosyanın adı: cdcode

Dosya içeriği:

cd ~/My Code

Şimdi verilmiş, bu uzun bir yol adı değil, ancak benim gerçek yol adım beş dizin derinliğinde ve bu dizinlerden dördünün yolda boşluklar var.

BTW, denedim cd "~/My Code"ve cd "~/My\ Code"bunların hiçbiri işe yaramadı.


1
Açıklanana benzer bir sorun yaşıyorum. İçinde boşluk olan bir dizine geçmenin olası yollarından hiçbiri. Gibi bir şey: cd "Pasaportum" cd My \ Pasaport cd "Pasaportum" hiçbir şey çalışmıyor. Complition iyi çalışıyor. Listeleyebilirim: ls -l My \ Passport / iyi çalışıyor. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Pzt 16 Temmuz 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, sürüm 3.1 .17 (1) -sürüm- (i686-redhat-linux-gnu) herhangi bir fikir lütfen?
Denis C

Yanıtlar:


81

Bir yolu çift tırnak içine aldığınızda, tilde genişlemesini durdurursunuz. Yani bunu yapmanın birkaç yolu var:

cd ~/"My Code"
cd ~/'My Code'

Yaklaşık işareti burada alıntılanmamaktadır, bu nedenle tilde genişletmesi çalışmaya devam edecektir.

cd "$HOME/My Code"

Çift tırnaklı dizelerdeki ortam değişkenlerini genişletebilirsiniz; bu temelde tilde genişletmesinin yaptığı şeydir

cd ~/My\ Code

Ayrıca ters eğik çizgi ile özel karakterlerden (boşluk gibi) kaçınabilirsiniz.


3
Yapabilirsin bile cd ~ / My' 'Kod, ancak bunun yerine ters eğik çizgi ile kaçabilir zaman o aptalca olurdu
Nick Dixon

43

Aşağıdaki çözümü bu sayfada buldum :

x="test\ me"  
eval cd $x

\Çift tırnaklı bir metin sabiti ve bir evalöncesinin kombinasyonu, cdonu bir cazibe gibi çalıştırır!


daha fazla netlik: Bir betik dosyasının dizinine cd'leme yapmak için: DIR = $ (dizin adı "$ 0"); eval cd $ DIR
Michael Scott Cuthbert

1
Bu, bir OS X makinesinde bir bash komut dosyası çalıştırmama gerçekten yardımcı oldu. 🎉
timbillstrom

Burada gerçekten gerek evalyok.
Benjamin W.

2
OS X'te, onsuz çalışmak için diğer / önceki yanıtları alamadım eval.
D. Woods

11

Aynı problemle mücadele ettikten sonra, işe yarayan iki farklı çözüm denedim:

1. ""Değişkenlerinizle çift ​​tırnak ( ) kullanın .

En kolay yol, önceki cevapta belirtildiği gibi değişkenlerinizi çift tırnak içine alır:

cd "$yourPathWithBlankSpace"

2. yararlanın eval.

Bu cevaba göre boşluklardan kaçmak için Unix komutuna göre boşlukları kaldırıp aşağıdaki evalgibi kullanabilirsiniz :

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

10
cd ~/My\ Code

benim için işe yarıyor gibi görünüyor ... Eğer tırnak işaretlerini düşürmek ama eğik çizgiyi korumak işe yaramazsa, bazı örnek kodlar gönderebilir misiniz?


10

Aşağıdakilerden herhangi birini kullanabilirsiniz:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

Kullanamazsınız:

cd ~"/My Code"

İlki çalışır çünkü kabuk ~ / $ HOME / içine genişler ve ardından benim Kodum'a çift tırnak olmadan işaretler. İkincisi başarısız olur çünkü eşlenecek ' "' (çift tırnak) adlı bir kullanıcı yoktur ~".


4

Tek bir ters eğik çizgi benim için çalışıyor:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

Sorunun, kabuk betiğinizin alt kabuğundaki dizini değiştirmesi olmadığından emin misiniz, ancak işiniz bittiğinde ana kabuğa (ve orijinal dizine) geri döndünüz mü? Kullanarak bundan kaçındım. betiği mevcut kabukta çalıştırmak için, ancak çoğu kişi bunun için bir takma ad kullanır. Boşluklar kırmızı ringa balığı olabilir.


Teşekkürler Ry4an (ve yanıtlayanların geri kalanı). Görünüşe göre komut dosyasını yanlış çalıştırıyorum. Sadece şu şekilde çalıştırmaya çalışıyordum:% ./cdsomedir "." komut dosyasını yaptığınız gibi çalıştırmak için:%. cdsomedir.sh Bunu yaptıktan sonra işe yaradı. Çaylak hatası. Teşekkürler!


3

Bunu yapacak:

cd ~/My\ Code

İCloud Drive'da depolanan dosyalarla çalışmak için bunu kullanmak zorunda kaldım. Çift tırnak (") kullanmak istemeyeceksiniz, çünkü o zaman mutlak bir yol olmalıdır Başka bir deyişle, çift tırnak işaretlerini tilde (~) ile birleştiremezsiniz.

Örnek olarak, bunu yeni bir proje için kullanmak zorunda kaldım:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

Umarım bu yardımcı olur.


2

Linux altında çalışırken aşağıdaki sözdizimi doğrudur:

cd ~/My\ Code

Ancak dosyanızı çalıştırırken aşağıdaki sözdizimini kullanın:

$ . cdcode

(sadece "." ve "./" değil)


Vahşi meraktan, bu neden önemli? Sadece "./" useed görmüştüm.
whaley

./ yeni bir kabuk oluşturur ve ardından dizini değiştirir. Yani komut dosyası çıktığında, yeni kabuğu oluşturan kabuğa geri döner ... ~ / My Code yerine betiği çalıştırdığınız dizinde olacaksınız. "." diğer yandan betiğin kabuğun o anki örneğinde çalıştırılmasına neden olur.
Alterlife

Nokta "." bir unix komutu, "kaynak" komutu için bir takma addır. Ardından bir dosya adı gelmelidir. Bu nedenle, "source myfile" dosyayı mevcut kabuğunuz içinde çalıştıracaktır. Ve ". Dosyam" da aynısını yapacak. "./" değişkeni "geçerli dizin" anlamına gelir ve bir komut değildir.
JPGConnolly

2

çift ​​tırnak kullanın

go () 
{ 
    cd "$*"
}

Teşekkürler. .bashrcBoşluklar içeren dizin adlarını komut satırına yapıştırırken, boşluklardan kaçmak veya her şeyi alıntı yapmak zorunda kalmadan, dizini değiştirmek için bir dosyadaki işlevlere yararlı bir ek . cdsdaha iyi bir isim.
mattst

Bunu (eğer olmadan) sadece goeşdeğer olacak şekilde genişletmenin bir yolu var mı cd, yani cd'den home dizine?
zennehoy

2

Bunu yapmanın çok basit yolu ...

 $ cd My\ Folder

Bash'de DIR komutunu çalıştırın ve sonuçlarda aralarında boşluk olan klasör veya yol adlarının şu şekilde sonuçlara yazıldığını göreceksiniz -

$dir
My\ Folder
New\ Folder

1

Şimdi benzer bir problemim vardı, bazı verileri dökmek için bir bash betiği kullanıyordum. Betik klasöründe içinde boşluk olmayan sembolik bir bağlantı oluşturdum. Daha sonra senaryomu sembolik bağlantıya yönlendirdim ve bu iyi çalışıyor.

Bağlantınızı oluşturmak için. ln -s [HEDEF DİZİN VEYA DOSYA] ./[SHORTCUT]

Mau veya işe yaramayabilir.


1

Tek tırnak kullanın, örneğin:

myPath=~/'my dir'

cd $myPath
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.