2009-02-26 13 views
71

Argggg. Od wielu dni zmagam się z tym głupim problemem i nie mogę znaleźć odpowiedzi.BASH Skrypt do katalogu cd ze spacjami w ścieżce

Używam BASH na Mac OS X i chciałbym stworzyć prosty plik skryptowy, który po uruchomieniu zostanie zmieniony na inny katalog. Ścieżka do tego katalogu zawiera jednak spacje. Jak do cholery robisz to? To jest to, co mam ...

Nazwa pliku: cdcode

zawartość pliku: cd ~/My Code

Teraz przyznano, nie jest długa ścieżka, ale moja rzeczywista ścieżka jest głęboko pięć katalogów a cztery z tych katalogów mają spacje na ścieżce.

BTW, próbowałem cd "~/My Code" i cd "~/My\ Code" i żaden z nich nie zadziałał.

+1

Mam podobny problem jak opisany. tj. żaden z możliwych sposobów na przejście do katalogu, w którym znajduje się spacja. Nic podobnego: CD "My Passport" cd My \ My Passport cd "Paszport" nic nie działa. Kompilacja działa dobrze. Mogę wymienić: ls -l Mój \ Passport/ działa dobrze. \> uname -a Host Linux 2.6.18-8.1.8.el5.centos.plus # 1 SMP Pon. Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU/Linux \> bash --help GNU bash, wersja 3.1.17 (1) -release- (i686-redhat-linux-gnu) jakieś pomysły proszę? –

Odpowiedz

6
cd ~/My\ Code 

wydaje się działać dla mnie ... Jeśli rezygnacja z cytatów, ale trzymanie ukośnika nie działa, czy możesz przesłać próbny kod?

4

Pojedynczy odwrotny ukośnik działa dla mnie:

[email protected]:~$ mkdir "My Code" 

[email protected]:~$ vi todir.sh 

[email protected]:~$ . todir.sh 

[email protected]:My Code$ cat ../todir.sh 
#!/bin/sh 
cd ~/My\ Code 

Czy na pewno problem nie że skrypt zmienia katalog w jego podpowłoce jest, ale to jesteś z powrotem w osłonie głównej (i oryginalna re) po zakończeniu? Unikałem tego przy użyciu. aby uruchomić skrypt w bieżącej powłoce, chociaż większość ludzi po prostu użyłaby aliasu do tego. Miejsca mogą być czerwonym śledziem.

+0

Dzięki, Ry4an (i reszta respondentów). Wygląda na to, że nieprawidłowo wykonałem skrypt. Po prostu próbowałem uruchomić to tak: % ./cdsomedir Nie zdawałem sobie sprawy, że muszę użyć "." aby uruchomić skrypt tak, jak zrobiłeś: %. cdsomedir.sh Kiedy to zrobiłem, zadziałało. Błąd Newbie. Dzięki! –

2

Podczas pracy pod Linuksem poniżej składnia ma rację:

cd ~/My\ Code

Jednak kiedy wykonujący swój plik, skorzystaj z poniższego składnię:

$ . cdcode

(tylko”. "i nie" ./ ")

+0

Z dzikiej ciekawości, dlaczego to ma znaczenie? Widziałem tylko "./". – whaley

+0

./ spowoduje utworzenie nowej powłoki, a następnie zmianę katalogu. Kiedy skrypt się kończy, wraca do powłoki, która wywołała nową powłokę ... znajdziesz się w katalogu, w którym wykonałeś skrypt zamiast ~/My Code. "." z drugiej strony powoduje, że skrypt zostanie wykonany w bieżącej instancji powłoki. – Alterlife

+0

Kropka "." to polecenie unix, alias dla polecenia "source". Po nazwie powinna znajdować się nazwa pliku. Tak więc "source myfile" uruchomi plik w twojej obecnej powłoce. I ". Myfile" zrobi to samo. Zmienna "./" oznacza "katalog bieżący" i nie jest poleceniem. – JPGConnolly

7

Można użyć dowolnego z:

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

nie można używać:

cd ~"/My Code" 

Pierwsze prace ponieważ powłoka rozszerza ~/do $ HOME /, a następnie pinezki na mój kod bez cudzysłowów. Druga kończy się niepowodzeniem, ponieważ nie ma użytkownika o nazwie """ (podwójny cudzysłów) do ~" do odwzorowania na.

67

Gdy podwójnie cytujesz ścieżkę, zatrzymujesz ekspansję tyldy. Tak więc istnieje kilka sposobów, aby to zrobić:

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

Tylda nie jest cytowany tutaj, więc tyldy będą nadal prowadzone.

cd "$HOME/My Code" 

Możesz rozwinąć zmienne środowiskowe wewnątrz podwójnie cudzysłowionych ciągów znaków; to jest w zasadzie to, co robi tyldy

cd ~/My\ Code 

Można też uciec znaków specjalnych (takich jak przestrzeń) z odwrotnym ukośnikiem.

+2

Moglibyśmy nawet CD ~/My '' Code, ale byłoby to głupie, gdy można uciec z ukośnikiem zamiast tego –

1

Miałem podobny problem teraz, gdy użyłem skryptu bash do zrzucenia niektórych danych. Skończyło się na tworzeniu dowiązania symbolicznego w folderze skryptu bez żadnych spacji. Następnie skierowałem swój skrypt na link symboliczny i to działa dobrze.

Aby utworzyć swój link. ln -s [KATALOG lub PLIK TARGET] ./[SHORTCUT]

Mau lub może nie być przydatne.

1

użyć cudzysłowów

go() 
{ 
    cd "$*" 
} 
+0

Dzięki. Przydatne uzupełnienie funkcji w pliku '.bashrc' do zmiany katalogu podczas wklejania nazw katalogów zawierających spacje do wiersza poleceń, bez konieczności ucieczki spacji lub cytowania całej rzeczy. 'cds' jest jednak lepszą nazwą. – mattst

+0

Czy istnieje sposób na rozszerzenie tego (bez if) takiego, że po prostu 'go' będzie równoznaczne z' cd', tzn. Cd do katalogu domowego? – zennehoy

1

Unikać ~ w skryptach; zamiast tego użyj $ HOME.

1

Bardzo prostym sposobem na osiągnięcie tego jest-

$ cd My\ Folder 

W bash, uruchom polecenie DIR i w wynikach będzie widać, że nazwy folderu lub ścieżka że przestrzeń między nimi zostało napisane w wynikach takich jak to -

$dir 
My\ Folder 
New\ Folder 
1

Po zmaga się z tym samym problemem, próbowałem dwa różne rozwiązania, które działa:

  • Porada1: Najłatwiej tylko cudzysłowy zmienne jak wskazano w poprzedniej odpowiedzi cd "$yourPathWithBlankSpace"
  • Solution2: Zgodnie z tą odpowiedzią Unix command to escape spaces można strip spację następnie skorzystania z eval tak:

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

Powiązane problemy