Skrypt Bash do cd do katalogu ze spacjami w nazwie ścieżki

96

Używam Bash na macOS X i chciałbym utworzyć prosty wykonywalny plik skryptu, który po uruchomieniu zmieniłby się na inny katalog. Jednak ścieżka do tego katalogu zawiera spacje. Jak do cholery to robisz? Oto, co mam ...

Nazwa pliku: cdcode

Zawartość pliku:

cd ~/My Code

Przyznaję, że nie jest to długa nazwa ścieżki, ale moja rzeczywista nazwa ścieżki ma głębokość pięciu katalogów, a cztery z nich mają spacje w ścieżce.

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

Benjamin W.
źródło
1
Mam podobny problem jak ten opisany. To znaczy żaden z możliwych sposobów przejścia do katalogu, w którym jest spacja. Nic takiego: cd "My Passport" cd My \ Passport cd Mój "Passport" nic nie działa. Kombinacja działa dobrze. Mogę wymienić: ls -l Mój \ Passport / działa dobrze. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Pon 16 lipca 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?
Denis C

Odpowiedzi:

81

Kiedy podwójnie cytujesz ścieżkę, zatrzymujesz ekspansję tyldy. Można to zrobić na kilka sposobów:

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

Tylda nie jest tutaj cytowana, więc rozszerzenie tyldy będzie nadal działać.

cd "$HOME/My Code"

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

cd ~/My\ Code

Możesz również zmienić znaczenie znaków specjalnych (takich jak spacja) za pomocą odwrotnego ukośnika.

derobert
źródło
3
Mógłbyś nawet cd ~ / My '' Code, ale byłoby to głupie, gdybyś zamiast tego mógł uciec z ukośnikiem odwrotnym
Nick Dixon
42

Znalazłem rozwiązanie poniżej na tej stronie :

x="test\ me"  
eval cd $x

Połączenie \stałej w tekście w podwójnym cudzysłowie i evalprzed cdpowoduje, że działa to jak urok!

user365757
źródło
większa jasność: Aby przejść do katalogu zawierającego plik skryptu: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert
1
To naprawdę pomogło mi w uruchomieniu skryptu bash na komputerze z systemem OS X. 🎉
timbillstrom
Naprawdę nie ma takiej potrzeby eval.
Benjamin W.
2
W systemie OS X nie mogłem uzyskać innych / wcześniejszych odpowiedzi bez eval.
D. Woods
11

Po zmaganiu się z tym samym problemem wypróbowałem dwa różne rozwiązania, które działają:

1. Użyj podwójnych cudzysłowów ( "") ze zmiennymi.

Najłatwiej jest po prostu podwójnie cytować zmienne, jak wskazano w poprzedniej odpowiedzi:

cd "$yourPathWithBlankSpace"

2. Skorzystaj z eval.

Zgodnie z tą odpowiedzią polecenie Unix, aby uciec ze spacji , możesz usunąć puste miejsce, a następnie użyć eval, na przykład:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
HanniBaL90
źródło
10
cd ~/My\ Code

wydaje mi się, że działa dla mnie ... Jeśli upuszczanie cudzysłowów, ale zachowanie ukośnika nie działa, czy możesz opublikować przykładowy kod?

Andrew Flanagan
źródło
10

Możesz użyć dowolnego z:

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

Nie możesz użyć:

cd ~"/My Code"

Pierwsza działa, ponieważ powłoka rozszerza ~ / do $ HOME /, a następnie dostosowuje Mój kod bez podwójnych cudzysłowów. Druga kończy się niepowodzeniem, ponieważ nie ma użytkownika o nazwie „ "” (podwójny cudzysłów), do którego ~"można zmapować.

Jonathan Leffler
źródło
4

U mnie działa pojedynczy lewy ukośnik:

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

Czy na pewno problem nie polega na tym, że twój skrypt powłoki zmienia katalog w swojej podpowłoce, ale po zakończeniu jesteś z powrotem w głównej powłoce (i oryginalnym katalogu)? Uniknąłem tego, używając. aby uruchomić skrypt w bieżącej powłoce, chociaż większość ludzi użyłaby do tego aliasu. Przestrzenie mogą być czerwonym śledziem.

Ry4an Brase
źródło
Dzięki Ry4an (i reszta respondentów). Wygląda na to, że niepoprawnie wykonywałem skrypt. Po prostu próbowałem to uruchomić w ten sposób:% ./cdsomedir Nie zdawałem sobie sprawy, że muszę użyć znaku „.” aby uruchomić skrypt tak, jak zrobiłeś:%. cdsomedir.sh Kiedy już to zrobiłem, zadziałało. Błąd początkującego. Dzięki!
3

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

Chris FA Johnson
źródło
2

Podczas pracy pod Linuksem składnia poniżej jest poprawna:

cd ~/My\ Code

Jednak podczas wykonywania pliku użyj poniższej składni:

$ . cdcode

(tylko „.”, a nie „./”)

Alterlife
źródło
Z dzikiej ciekawości, dlaczego to ma znaczenie? Widziałem tylko „./”.
whaley
./ utworzy nową powłokę, a następnie zmieni katalog. Więc kiedy skrypt kończy pracę, wraca do powłoki, która stworzyła nową powłokę ... będziesz w katalogu, w którym wykonałeś skrypt zamiast ~ / My Code. '.' z drugiej strony powoduje wykonanie skryptu w bieżącej instancji powłoki.
Alterlife
Kropka "." jest poleceniem unixowym, aliasem dla polecenia „source”. Powinna następować nazwa pliku. Tak więc „source myfile” uruchomi plik w bieżącej powłoce. I „. Myfile” zrobi to samo. Zmienna „./” oznacza „katalog bieżący” i nie jest poleceniem.
JPGConnolly
2

użyj podwójnych cudzysłowów

go () 
{ 
    cd "$*"
}
Bobo
źródło
Dzięki. Przydatny dodatek do funkcji w .bashrcpliku do zmiany katalogu podczas wklejania nazw katalogów zawierających spacje do wiersza poleceń bez konieczności ucieczki spacji lub cytowania całości. cdsto jednak lepsze imię.
Mattst
Czy jest jakiś sposób na rozszerzenie tego (bez if) tak, że gobędzie to równoważne cdnp. Cd do katalogu domowego?
zennehoy
2

Bardzo prostym sposobem na to jest-

 $ cd My\ Folder

W bashu uruchom polecenie DIR, a w wynikach zobaczysz, że nazwy folderów lub ścieżek mające spację między nimi zostały zapisane w wynikach takich jak ten -

$dir
My\ Folder
New\ Folder
Mayukh Datta
źródło
2

To zrobi to:

cd ~/My\ Code

Musiałem tego używać do pracy z plikami przechowywanymi na iCloud Drive. Nie będziesz chciał używać podwójnych cudzysłowów ("), ponieważ wtedy musi to być ścieżka bezwzględna. Innymi słowy, nie możesz łączyć podwójnych cudzysłowów z tyldą (~).

Na przykład musiałem użyć tego do niedawnego projektu:

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

Mam nadzieję że to pomogło.

Josh
źródło
1

Miałem podobny problem teraz, gdy używałem skryptu bash do zrzucenia niektórych danych. Skończyło się na utworzeniu dowiązania symbolicznego w folderze skryptów bez żadnych spacji. Następnie wskazałem mój skrypt na dowiązanie symboliczne i to działa dobrze.

Aby utworzyć łącze. ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]

Mau lub może nie być przydatne.


źródło
1

Użyj apostrofów, takich jak:

myPath=~/'my dir'

cd $myPath
Jadian
źródło